Здесь у меня есть пример:
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 нашел там нет сильной ссылки использования позже, так что это не сильные достижимы?
Поскольку ваш цикл работает довольно «горячий» с точки зрения использования ресурсов, виртуальная машина будет хотеть, чтобы оптимизировать его. Это может указывать компилятору на то, что на самом деле сильная ссылка не может быть достигнуто после входа в цикл и, таким образом, оптимизировать его.
Такое поведение, скорее всего , изменится , если вы что- то добавить , как System.out.println(obj)
после цикла. Вы , возможно , потребуется изменить свое состояние цикла , так что компилятор не может видеть , что новое утверждение фактически недостижимого кода ... (что - то вроде while (weakRef.get() != null)
)