SfondoCome risolvere le perdite di memoria del listener swing?
così ho letto che spesso perdite di memoria all'interno di applicazioni Swing provengono da l'uso di vari ascoltatori (mouse, tastiera, fuoco, ecc). Essenzialmente, poiché si registra un oggetto come ascoltatore e si dimentica di annullare la registrazione dell'oggetto, il notificatore finisce per trattenere il riferimento dell'oggetto e perde un po 'di memoria.
Sapevo che la nostra applicazione non è stata Annullamento della registrazione di ascoltatori e ha fatto un po 'di ricerca sulle possibili soluzioni:
ho trovato un approccio nell'affrontare il problema era l'uso di un WeakReference, tutti i dettagli sul metodo con swing gli ascoltatori possono essere trovati here.
Ho poi diventato curioso di sapere come l'editor NetBeans modulo stava generando codice per pulire dopo ascoltatori aggiunti alla forma e hanno scoperto che NetBeans registrava ascoltatori tramite un oggetto involucro cioè
argTypeComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
argTypeComboBoxItemStateChanged(evt);
}
});
Ma il codice generato ha fatto non sembra mai ripulire chiamando lo removeItemListener
.
Domande
è l'oggetto di avvolgimento agisce come un riferimento debole? A me sembra che potrebbe perdere una piccola quantità di memoria (la dimensione dell'oggetto wrapping)?
Hai approcci alternativi quando hai a che fare con gli ascoltatori per assicurarti che siano sempre garbage collection quando hai finito con loro?
Grande chiarimento Yishai, qual è stato l'approccio che hai intrapreso per trattare con gli ascoltatori nella fantastica applicazione che ha avuto una perdita di memoria? – Clinton
@Clinton, una volta diagnosticato il problema (che ha richiesto un po 'di tempo, un sacco di profilazione), ero sicuro di annullare la registrazione dell'ascoltatore sulla finestra. Non ricordo tutti i dettagli, ma quella era la chiave - non sapevo allora di riferimenti deboli come una soluzione standard al problema, avrei potuto essere in grado di usarlo. – Yishai
@Yishai Avevo fatto il deregistration dato che l'ascoltatore stava lasciando il campo ... Ma sembrava un po 'goffo e andò alla ricerca di una soluzione migliore. Grazie ancora per la correzione. – Clinton