Java es objeto gc-ed cuando todavía está vinculado con una fuerte referencia y una referencia weaked

zhuj9:

Aquí tengo un ejemplo:

import java.lang.ref.WeakReference;

public class WeakRefTest {
    public static void main(String[] args) {
        Object obj = new Object();
        WeakReference<Object> weakRef = new WeakReference<Object>(obj);
        int i = 0;
        while (true) {
            if (weakRef.get() != null) {
                i++;
                System.out.println("The object is alive for " + i + " loops - " + weakRef);
            } else {
                System.out.println("The object has been collected.");
                break;
            }
        }
    }
}

Cuando se ejecuta este programa, nos pondremos en contacto con la salida "The object has been collected."después de un tiempo, lo que significa que el objeto será gc-ed.

Sin embargo, todavía hay una fuerte referencia con nombre "obj"relacionado con el objeto, ¿cómo puede ser reclamado? Debido a JVM encontró que no hay uso de las referencias fuerte más tarde, así que no es alcanzable fuerte?

Nicktar:

Desde su loop está funcionando bastante "caliente" en términos de uso de recursos, la JVM va a querer optimizarlo. Si lo hace, podría apuntar al compilador que el hecho de que, de hecho, la fuerte referencia no puede ser alcanzado después de entrar en el bucle y así optimizar la basura.

Este comportamiento es probable que cambie si se agrega algo así como System.out.println(obj)después de su bucle. Puede que sea necesario ajustar su condición de bucle para que el compilador no puede ver que la nueva declaración es en realidad código inalcanzable ... (algo así while (weakRef.get() != null))

Supongo que te gusta

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