Слабая ссылка не собирать мусор? - PullRequest
3 голосов
/ 05 июня 2011

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

10 голосов
/ 05 июня 2011

weakReference само не станет нулевым ... как это могло?Однако, его target может стать нулевым.

Я подозреваю, что вы имеете в виду:

while (weakReference.get() != null) {

Более того, я подозреваю, что если вы сами не установите для weakInt значение null, тоЛокальная переменная предотвратит сбор мусора для объекта 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");
    }
}
...