Я читал литературу по WeakReference в Java API документации для Java 7 и попытались проверить то же самое со следующимGC для WeakReference и StrongReference в Java
package com.finalize;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
public class WeakRefernceTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String x = new String("x1");
String y = new String("x2");
Map<String, Object> mw = new WeakHashMap<>();
mw.put(x, new Object());
Map<String, Object> m = new HashMap<>();
m.put(y, new Object());
x = null;
y = null;
for(int i = 0; i < 5;++i)
System.gc();
System.out.println(mw.size());
System.out.println(m.size());
}
}
Когда я запустил его несколько раз, я мог видеть что mw.size() был напечатан как 0. Но я немного смущен, потому что m.size() никогда не печатается как 0. Поэтому в основном я пытаюсь понять GC по умолчанию, который запускался в этой горячей точке jvm. Поэтому, когда GC начинает отмечать доступные объекты и запускается после того, как x и y заданы как null, почему он указывает объект, на который ссылается y, как достижимый, потому что y был установлен как null? Даже если корневая переменная задана как m, почему GC когда-либо достигает объекта, ранее указанного y, и объявляет его доступным?
Напротив, какова подробная последовательность изменений жизненного цикла на x?
Вопрос только в том, что цепочка выше отражает entry-> x2 вместо entry-> y-> null, что означало бы, что «x2» может быть собрано, а также второй частью моего вопроса была подробная последовательность, и я хотел понять, где в цепочке объект переходит к ReferenceQueue и что происходит тогда. Извините, если это не ясно из вопроса. – 100pipers
Вы в замешательстве. Просто потому, что вы устанавливаете y в null, это не означает, что ключ в hashmap становится нулевым. Когда вы ставите y в качестве ключа на карте, карта получает копию ссылки и сохраняет ее в одной из своих записей. Установка y в значение null делает y не указаным, но запись на карте по-прежнему ссылается на строку «x2». Java передается по значению. –
Вы правы, я думаю, что пропустил точку здесь. Не могли бы вы также ответить на вторую половину вопроса о том, где в цепочке объект (указываемый ранее с помощью слабой ссылки) переходит к ReferenceQueue и что происходит дальше? Спасибо, я приму ответ и закрою его. Причина, по которой я подчеркиваю это, состоит в том, что у меня может быть связанный вопрос с ответом !! Но спасибо!! – 100pipers