Слабая ссылка не собирать мусор?

Я изучал слабые ссылки. И я понял, что все слабые ссылки будут собираться мусором до того, как произойдет 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");
    }
}
Другие вопросы по тегам