¿Por qué parece el objeto JFrame para mantenerse con vida, a pesar de que no hay referencias a ella?

Aviv Cohn:

Si no recuerdo mal, en Java se puede escribir

new JFrame();

sin guardar la JFramereferencia en cualquier variable. Este programa mostrará una ventana de interfaz gráfica de usuario en pantalla y dejarlo abierto, hasta que el programa se cierra. (Por favor, corríjanme si esta premisa es falsa).

En teoría, se podría pensar que ya que el JFramees ahora inalcanzable desde el código de usuario, el GC debe en algún momento liberar el objeto. Y como resultado, se liberarán los recursos del sistema operativo asociados (la ventana de interfaz gráfica de usuario, etc.), así.

Sin embargo, si he entendido bien - que el programa es un programa Java válido y de trabajo (aunque sea bastante inútil), y no se bloqueará o se comportan de manera extraña en cualquier punto (de nuevo me corrija si esta premisa es errónea).

Parece que el GC no recoja el JFrameobjeto a pesar de que no hay referencias a él, o al menos que no causa los recursos del sistema operativo asociados a ser liberados.

Me gustaría entender: ¿Cómo es esto posible?

  1. ¿El constructor de JFrameahorro thispueden recoger en cualquier lugar con el fin de no? En el código fuente de JFrame's superclase java.awt.Frame (método noteFrame) la trama parece estar guardado en una cola de referencias débiles. Sin embargo, ya que estos son referencias débiles, que no parece explicar las cosas

  2. Es de hecho el caso de que el GC no finalmente liberar el JFrame- sin embargo, el método finalizador de JFrame no liberar los recursos del sistema operativo asociados, por lo tanto las estancias de ventana GUI abren?

  3. Cualquier otra explicación?

Tenga en cuenta que este es un seguimiento a una pregunta más pregunta teórica he publicado en SE.SE . Esta cuestión es diferente, ya que se relaciona específicamente con los detalles de implementación de Java.

Holger:

Una JFrameque sólo se crea a través new JFrame()sin ninguna acción adicional no quede abierta en la pantalla y no impidió la recolección de basura. Sólo un bastidor conectado a un dispositivo de visualización se hará referencia a partir de la implementación del AWT y no puede recibir basura recogida antes de que se haya desconectado de forma explícita.

El cual puede ser verificado con el siguiente código:

public static void main(String[] args) {
    check(new JFrame(), "just creating a JFrame", x -> {});
    check(new JFrame(), "creating and connecting a JFrame", JFrame::pack);
    check(Frame.getFrames()[0], "calling dispose()", Frame::dispose);
}
private static <T> void check(T obj, String description, Consumer<T> action) {
    System.out.println(description);
    action.accept(obj);
    WeakReference<T> r = new WeakReference<>(obj);
    obj = null;
    System.gc();
    if(r.get() == null) System.out.println("collected immediately");
    else {
        System.runFinalization();
        System.gc();
        if(r.get() == null) System.out.println("collected after finalization");
        else System.out.println("still alive");
    }
}

que imprimirá

just creating a JFrame
collected immediately
creating and connecting a JFrame
still alive
calling dispose()
collected after finalization

en las implementaciones típicas.

Vale la pena señalar que una trama que nunca fue conectado a un dispositivo de visualización obtiene recogido inmediatamente como un objeto ordinario, mientras que un marco que estaba conectado y más tarde, en desconectada a través de una dispose()llamada requiere una acción de limpieza, que tiene lugar después de la carrera colector primero de basura .

Además, el ejemplo se utiliza pack()en lugar de setVisible(true), para demostrar que una trama puede conectarse a un dispositivo de visualización sin ser visible. Esto hace que la diferencia entre isDisplayable()lo que refleja si el componente está conectado a un dispositivo de pantalla y isVisible()la que dice si la visible propiedad ha sido ajustada a true. Por último, un componente no sólo se informan isShowing()como truecuando es visible y visualizable y todos sus padres están mostrando.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=392393&siteId=1
Recomendado
Clasificación