Java-Objekt ist gc-ed, wenn es nach wie vor mit einem starken Bezug verknüpft und einer weaked Referenz

zhuj9:

Ich habe hier ein Beispiel:

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;
            }
        }
    }
}

Wenn dieses Programm ausgeführt wird , werden wir Ausgang mit bekommen "The object has been collected."nach einer Weile, was bedeutet , dass das Objekt gc-ed sein.

Allerdings gibt es nach wie vor eine starke Referenz genannt "obj"mit dem Objekt verknüpft, wie kann es zurückgewonnen werden? Da JVM gefunden gibt es keine starke Referenz Nutzung später, so ist es nicht stark erreichbar?

Nicktar:

Da Ihre Schleife „hot“ läuft ganz in Bezug auf die Ressourcennutzung, werden Sie wollen die JVM optimieren. Andernfalls kann der Compiler auf die Tatsache hinweisen, dass der starke Bezug kann in der Tat nicht nach dem Eintritt in die Schleife zu erreichen und damit optimieren sie weg.

Dieses Verhalten wird sich wahrscheinlich ändern , wenn Sie so etwas wie hinzufügen System.out.println(obj)nach der Schleife. Möglicherweise müssen Sie die Schleifenbedingung optimieren , so dass der Compiler nicht , dass die neue Anweisung ist in der Tat nicht erreichbar Code sehen kann ... (so etwas wie while (weakRef.get() != null))

Ich denke du magst

Origin http://10.200.1.11:23101/article/api/json?id=431321&siteId=1
Empfohlen
Rangfolge