Una de las pérdidas de memoria que he descubierto en nuestra aplicación es el campo estático privado java.awt.Window.allWindows
, que realiza un seguimiento de cada ventana instanciada. Tenemos cuadros de diálogo que se crean, usan y luego se olvidan, y se esperaba que desaparecieran y se recogieran basura. Este campo privado los mantiene en el alcance, indefinidamente, hasta que se les llame al método dispose()
. Y, por definición, no podemos hacer eso cuando se salieron del alcance.¿Por qué debería tener que deshacerse de() una ventana java.awt.Window que sale del alcance?
No entiendo por qué esto está diseñado de esta manera. Parece contrario al espíritu de la recolección de basura tener que dejar explícitamente al sistema saber cuando haya terminado con un objeto de ventana. Obviamente ya terminé, ya que está fuera de mi alcance.
Entiendo lo que hace el método dispose()
: deshacerse de los objetos similares del sistema. Entiendo que esto está fuera de Java y que necesita alguna forma de hacerlo y que Swing no debería simplemente perder la pista de esos objetos, o de lo contrario tendría una pérdida de memoria. Pero, ¿qué se logra manteniendo una referencia a mi Ventana para siempre, cuando nunca más voy a usarlo?
¿Alguien puede explicar por qué es necesario?
Cuando se llama a 'removeNotify', la' Ventana' se eliminará de 'allWindows'. 'Las ventanas' contienen recursos nativos, por lo que deben eliminarse de la misma manera que si fuera una conexión de base de datos. –
Tenía la impresión de que cuando las conexiones de mi base de datos quedan fuera del alcance, se cierran automáticamente.Probablemente estoy equivocado acerca de eso. :) Sin embargo, hoy en día, todo lo que un servidor me administra, a excepción de los programas cortos. – skiphoppy