2011-03-25 31 views
5

¿Cómo es que las instancias de JFrame siempre son accesibles dentro de una aplicación Swing? ¿Eso no evitará que se recolecte basura?¿Por qué Swing JFrame siempre es accesible?

 
JFrame frame = new JFrame(); 
System.out.println(Window.getWindows().length); // says '1' 

Llamar a dispose() no ayuda. Ni siquiera se muestra.

Respuesta

5

No hay método getWindows en java.awt.Windows, pero hay un método Frame.getFrames().

Pero sé que ambos usan WeakReference para administrar tales cosas.

Básicamente, la idea es que tanto la clase de ventana y marco tiene un campo llamado weakThis que es un WeakReference al objeto/ventana actual. Siempre que el objeto necesite ser almacenado (por ejemplo, en el contexto de aplicación), se usa el campo weakThis en lugar de este. (Las referencias débiles no detienen el encriptado de objetos, en caso de que no lo supiera)

EDIT: Window.getWindows se agrega en 1.6.

-2

Esto es porque todavía tiene una referencia a su ventana, no hizo el JFrame listo para la recolección de basura, esto se hace eliminando la referencia al mismo. Por ejemplo, configurándolo en nulo;

El siguiente ejemplo arrojará 0 si el recolector de basura realizó una ronda de limpieza.

JFrame frame = new JFrame(); 
frame = null; 
System.gc(); 
System.out.println(Window.getWindows().length); 

Esto es código de ejemplo, que trabajará la mayor parte del tiempo, si se invoca la GC. No se garantiza que System.gc() invocará el GC. No use esto en el código de producción.

-2

Porque el objeto JFrame no se ha recogido basura. Pruebe esto:

import java.io.*; 
import java.awt.*; 
import javax.swing.*; 
public class WTest 
{ 
    public static void main(String[] args) 
    { 
     JFrame jfTmp = new JFrame(); 
     jfTmp.dispose(); 
     jfTmp = null; 

     System.runFinalization(); 
     System.gc(); 

     Window[] arrW = Window.getWindows(); 
     for(int i = 0; i < arrW.length; i ++) 
      System.out.println("[" + i + "]\t" + arrW[i].getClass()); 
    } 
} 
+1

No bueno. No puede forzar a la JVM a ejecutar una recolección de elementos no utilizados. – Bombe

Cuestiones relacionadas