2011-09-11 16 views
8

Estoy escribiendo un programa de pruebas de la siguiente manera:¿La eliminación de un JFrame causa una fuga de memoria?

  1. Cuando un usuario hace clic en el botón A, se abre 50 JFrames.
  2. Cuando el usuario hace clic en el botón B se dispone todas las JFrames mostrados haciendo clic en el botón A.

Me parece que la memoria no disminuye después de hacer clic el botón B. pues determiné usando el Administrador de tareas, ctrl +alt + del en Windows, y comprobando el uso de memoria de "java".

+0

Cierto código nos ayudará definitivamente ... –

+1

Ver [Eliminar contenedor de nivel superior en Runtime] (http://stackoverflow.com/questions/6309407/remove-top-level-container-on-runtime/6310284# 6310284). – trashgod

+1

Mi código no es nada especial. Creando JFrame por nuevo JFrame. Elimínelo llamando a dispose() – Bear

Respuesta

11

Así es, de ninguna manera, no es capaz de resolver ese (no sólo en Java PL),

1) realmente no crear un montón de Top-Level Containers en tiempo de ejecución/volar, porque nunca se finalizan, y hasta que sale instancia de JVM actual, y estos objetos nunca se ha GC'ed sólo su Grapfics2D

2) myContainer#dispose() en tiempo de ejecución es igual por ejemplo JVM actual como myContainer#setVisible(false) en las conexiones con JVM disponibles y se utilizan memoria

3) crear sólo unos pocos Top-Level Containers (máxima está representada de forma simultánea), la reutilización, pero no ponen JPanel como 1.st JComponent y llaman myPanel#removeAll(), de lo contrario se le quita y RootPane de su contenedor sólo permanece Borders :-) sería translúcida

4) PARCIALMENTE es posible reducir JVM utiliza memoria por GC llamada, pero sólo returs cantidad de Graphics2D y Garbage no funciona immediatelly,

5) más here información útil here

+0

thx mucho. Pero no entiendo la sugerencia 3. – Bear

+0

por cierto, ¿Java conoce el problema? – Bear

+0

@Bear tiene dos opciones 1) crear tres - cuatro contenedores de nivel superior, 1er. Sería JFrame otro JDialog (con Modality también) o JWindow, 2) o buscar CardLayout http://download.oracle.com/javase/tutorial/uiswing/layout/card.html y luego cambiar las tarjetas de Betweens en lugar de crear Top- Level Containers :-) – mKorbel

2

Sin ningún código no podemos ayudarte mucho ... ¿estás llamando jFrame. dispose()?

pública dispose void()

Libera todos los recursos de pantalla nativas utilizadas por esta ventana, sus subcomponentes, y todos sus elementos secundarios que pertenecen. Eso es, los recursos para estos componentes se destruirán, cualquier memoria que consumen será devuelta al sistema operativo, y se marcarán como indisponible.

Más información disponible here

0

Si hay una fuerte referencia a la raíz del GC (recolector de basura) de su marco, si llamó al método de eliminación, no se recoge basura, por lo que no puede ver ningún cambio de memoria después de deshacerse de todos los marcos Si quieres memoria, de cosas que debes lanzar, entonces necesitas recoger los marcos.