объект Java является дс-эд, когда он по-прежнему связан с сильным ссылкой и weaked ссылки

zhuj9:

Здесь у меня есть пример:

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

При запуске этой программы, мы получим выход с "The object has been collected."через некоторое время, что означает , что объект будет дс-е изд.

Тем не менее, все еще существует сильная ссылка с именем "obj"связаны с объектом, как это можно исправить? Поскольку JVM нашел там нет сильной ссылки использования позже, так что это не сильные достижимы?

Nicktar:

Поскольку ваш цикл работает довольно «горячий» с точки зрения использования ресурсов, виртуальная машина будет хотеть, чтобы оптимизировать его. Это может указывать компилятору на то, что на самом деле сильная ссылка не может быть достигнуто после входа в цикл и, таким образом, оптимизировать его.

Такое поведение, скорее всего , изменится , если вы что- то добавить , как System.out.println(obj)после цикла. Вы , возможно , потребуется изменить свое состояние цикла , так что компилятор не может видеть , что новое утверждение фактически недостижимого кода ... (что - то вроде while (weakRef.get() != null))

рекомендация

отhttp://10.200.1.11:23101/article/api/json?id=431501&siteId=1