Слабая ссылка не собирать мусор?
Я изучал слабые ссылки. И я понял, что все слабые ссылки будут собираться мусором до того, как произойдет OutOfMemoryError. У меня был простой тест, похожий на этот (я знаю, что ловить OOME - это не хорошо, а просто тест):
Integer weakInt = new Integer(10);
WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt);
try {
while (weakReference != null) {
String[] generateOutOfMemoryStr = new String[999999999];
}
}
catch (OutOfMemoryError oome) {
System.out.println(weakReference.get());
}
Я ожидал, что ноль будет напечатан, потому что слабая ссылка ДОЛЖНА быть собрана, но я всегда получаю вывод 10.
Пожалуйста, дайте мне знать, где я иду не так. Может быть, я неправильно понял концепцию слабых ссылок?
1 ответ
weakReference
само по себе не станет нулевым... как это могло? Однако его цель может стать нулевой.
Я подозреваю, что вы имеете в виду:
while (weakReference.get() != null) {
Более того, я подозреваю, что если вы не установите weakInt
сам ноль, эта локальная переменная будет препятствовать Integer
объект из мусора.
Более того, я подозреваю, что вы обнаружите, что ваш цикл все еще не закончится - потому что вы вполне можете запросить больше памяти, чем может быть выделено, даже если Integer
это мусор
Вот программа, которая демонстрирует, как она работает, по крайней мере, на моей коробке:
import java.lang.ref.*;
public class Test {
public static void main(String[] args) {
Integer weakInt = new Integer(10);
WeakReference<Integer> weakReference = new WeakReference<Integer>(weakInt);
weakInt = null;
while (weakReference.get() != null) {
System.out.println("Looping...");
String[] generateOutOfMemoryStr = new String[999999];
}
System.out.println("Weak reference collected");
}
}