2009-12-10 11 views
9

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?

Respuesta

14

Primero una corrección, la fuga potencial aquí no es pequeña. Una clase interna anónima contiene una referencia a la clase externa, de modo que mientras el oyente sea accesible, se mantendrá en toda la clase.

Sin embargo, esto normalmente no es un problema, ya que está agregando detectores a objetos en un marco. Cuando ese marco está dispuesto (aunque es importante que lo eliminen) y no tiene más referencias (lo cual es bastante típico), todos sus componentes se vuelven inalcanzables (si no hizo nada extravagante) y todo el conjunto obtiene basura recolectada.

Una vez me refería a una aplicación, sin embargo, que hacía cosas extravagantes, como registrar ventanas abiertas con una ventana diferente, por lo que si la ventana estaba cerrada, todavía estaba registrada - pérdida de memoria a gran velocidad - estas ventanas no minúsculo.

Así que la conclusión es que NetBeans no hace nada para causar "fugas" de memoria ya que el marco hace referencia al componente y no al exterior y el componente hace referencia a la clase anónima, que a su vez hace referencia al marco - disponga el marco y no se puede llegar al gráfico completo, pero debe tener cuidado con los oyentes, ya que pueden hacerlo por usted.

+0

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

+0

@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

+0

@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

Cuestiones relacionadas