Antecedentes¿Cómo se resuelven las pérdidas de memoria del oyente oscilante?
lo que he leído que a menudo pérdidas de memoria en aplicaciones Swing se originan en el uso de varios oyentes (ratón, llave, enfoque, etc.). Básicamente, debido a que registra un objeto como oyente y olvida anular el registro del objeto, el notificador termina reteniendo la referencia del objeto y pierde un poco de memoria.
supe nuestra solicitud no fue cancelar el registro de oyentes y ha hecho un poco de investigación sobre las posibles soluciones:
me encontré con uno de los enfoques para tratar con el problema era el uso de un WeakReference, todos los detalles sobre el enfoque con el swing oyentes se pueden encontrar here.
entonces me entró la curiosidad acerca de cómo el editor NetBeans forma se genera código para limpiar después de oyentes añaden a la forma y descubrieron que NetBeans registraba los oyentes a través de un objeto envoltorio es decir
argTypeComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
argTypeComboBoxItemStateChanged(evt);
}
});
Pero el código generado hizo parece que nunca se limpia llamando al removeItemListener
.
Preguntas
es el objeto de envolver actuando como una referencia débil? Para mí, parece que podría filtrar una pequeña cantidad de memoria (el tamaño del objeto de envoltura)?
¿Tiene enfoques alternativos cuando se trata de oyentes para asegurarse de que siempre son basura cuando termina con ellos?
Gran clarificación Yishai, ¿cuál fue el enfoque que tomaste para tratar con los oyentes en la elegante aplicación que tuvo una gran pérdida de memoria? – Clinton
@Clinton, una vez que diagnostiqué el problema (eso llevó un tiempo, muchos perfiles), estaba seguro de anular el registro del oyente en la ventana de eliminación. No recuerdo todos los detalles, pero esa era la clave. No sabía entonces acerca de las referencias débiles como una solución estándar para el problema, podría haber sido capaz de usar eso. – Yishai
@Yishai He estado haciendo el registro del registro cuando el oyente dejaba de ver el alcance ... Pero me pareció un poco torpe y busqué una solución mejor. Gracias de nuevo por la corrección. – Clinton