Una delle perdite di memoria che ho scoperto nella nostra applicazione è il campo statico privato java.awt.Window.allWindows
, che tiene traccia di ogni finestra creata. Abbiamo finestre di dialogo che vengono create, utilizzate e poi dimenticate, e l'aspettativa era che queste sarebbero andate via e sarebbero state raccolte. Questo campo privato li mantiene in ambito, indefinitamente, finché non viene richiamato il metodo dispose()
. E per definizione, non possiamo farlo quando sono andati fuori portata.Perché dovresti disporre() di una java.awt.Window che va fuori campo?
Non capisco perché questo sia stato progettato in questo modo. Sembra contrario allo spirito della garbage collection di dover esplicitare esplicitamente il sistema quando ho finito con un oggetto Window. Ovviamente ho finito, dato che è fuori portata.
Capisco cosa sta facendo il metodo dispose()
: sbarazzarsi degli oggetti peer di sistema. Capisco che questo sia fuori da Java e che tu abbia bisogno di un modo per farlo e che Swing non dovrebbe semplicemente perdere la traccia di quegli oggetti, altrimenti avrebbe una perdita di memoria. Ma cosa si ottiene mantenendo un riferimento alla mia Finestra in giro per sempre, quando non lo userò mai più?
Qualcuno può spiegare perché è necessario?
Quando viene chiamato 'removeNotify',' Window' viene rimosso da 'allWindows'. 'Window's contiene risorse native e quindi dovrebbe essere eliminato allo stesso modo di una connessione al database. –
Ho avuto l'impressione che quando le mie connessioni al database escono dall'ambito, si chiudono automaticamente.Probabilmente mi sbaglio. :) Al giorno d'oggi però, tutto ciò è gestito per me da un server tranne che per i programmi brevi. – skiphoppy