9

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?

+0

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. –

+0

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

risposta

14

Odio dirlo, ma è proprio come funziona una GUI.

Le finestre non sono bloccanti. Significa che una volta creato uno in codice, il codice continua a essere eseguito.

Ciò significa che la finestra probabilmente si sposterà immediatamente dopo la creazione, a meno che non abbiate memorizzato esplicitamente un riferimento ad esso altrove. La finestra è ancora sullo schermo a questo punto.

Questo significa anche che hai bisogno di un altro modo per sbarazzartene quando hai finito. Immettere il metodo Window dispose(), che può essere richiamato da uno degli ascoltatori di Windows.

+1

D'oh! Capisco! Le persone creano finestre tutto il tempo a cui non tengono riferimenti, ma le finestre sono ancora visibili e in esecuzione. Non ci pensavo proprio perché in questa situazione usiamo immediatamente la finestra rendendola invisibile, poi dimenticandola (andando fuori campo). Ora capisco perché questo è l'impostazione predefinita per Windows. Sapevo che c'era un caso d'uso razionale da qualche parte. :) – skiphoppy

+0

Oh, giusto, avrei dovuto sottolineare che la finestra era ancora sullo schermo quando la sua variabile era fuori portata. Lo modificherò nella mia risposta nel caso qualcuno lo manchi. – Powerlord

2

Questo potrebbe spiegare: AWT Threading Issues

Semplicemente, c'è molto di più in corso nella JVM che solo i componenti visibili, con sfondo fili e così via. Questi thread e altre risorse vengono mantenute fino a quando non viene eliminata l'ultima finestra sulla JVM, dopodiché vengono riordinate e la JVM può quindi uscire in modo pulito. Quindi ogni finestra, frame e finestra di dialogo che si utilizza è essenzialmente in possesso di un blocco sulla JVM per impedirne la chiusura, e devi gestirlo manualmente con le chiamate a dispose().

Sono d'accordo che è un po 'un bugger. Ho corso inosservato di questo alcune volte.

1

In Java quando si dispone di codice nativo (che è ciò che sono i peer di questi componenti di Windows), è necessario mantenere un riferimento per impedire al garbage collector di cercare di raccogliere l'oggetto mentre i puntatori nativi sono ancora in giro, che causerebbe tutti i tipi di cose cattive (VM si blocca, ecc.).

Vedere, ad esempio, la discussione here.

1

Il metodo dispose() distrugge l'oggetto detenuto dall'oggetto WindowEvent. Non uccide l'applicazione/p

Problemi correlati