#java #сборщик_мусора
Ситуацию МОЖНО воспроизвести: достаточно просто воспроизвести следующий код. И вопрос
задан по существу и касается механизма работы сборщика мусора.
Если сборщик мусора запустится сразу после выполнения m1 = null; m2 = null;, то сколько
объектов будет недоступны, и поэтому могут быть удалены сборщиком мусора?
public class MyTest {
MyTest m;
void show() {
System.out.println("Привет, Мир.");
}
public static void main(String args[]) {
MyTest m1 = new MyTest();
MyTest m2 = new MyTest();
MyTest m3 = new MyTest();
m1.m = m2;
m2.m = m3;
m3.m = m1;
m1 = null;
m2 = null;
// Вопрос: если сборщик мусора запустится здесь, то сколько объектов будет
недоступны, и поэтому могут быть удалены сборщиком мусора?
}
}
Ответы
Ответ 1
Вы удивитесь, но правильный ответ - Implementation defined. В том смысле, что в зависимости от реализации JVM могут быть освобождены хоть все объекты MyTest, хоть ни одного. И в обоих случаях поведение будет абсолютно корректным по отношению к Java Language Specification и Java Memory Model. Докажу на примере: public static void main(String args[]) { MyTest m1 = new MyTest(); MyTest m2 = new MyTest(); MyTest m3 = new MyTest(); m1.m = m2; m2.m = m3; m3.m = m1; m1 = null; m2 = null; // Слабая ссылка обнулится, как только объект m3 будет собран WeakReference ref = new WeakReference<>(m3); for (int i = 0; ref.get() != null; i++) { if ((i % 1000) == 0) System.gc(); } System.out.println("m3 is garbage-collected"); } После нескольких тысяч итераций цикла метод скомпилируется JITом, ссылок на объект m3 больше не будет, и он удалится после очередной сборки мусора. Однако если запустить Java с флагом -Xint, то ссылка на m3 всегда будет лежать доступной на стеке, и программа зациклится. Забавно, но факт: даже объект this может быть освобождён сборщиком мусора прямо во время выполнения метода на этом объекте. Подробности в JDK-8055183. В Java 9 даже будут дополнения к Java Memory Model и специальный метод Reference.reachabilityFence, чтобы избежать подобных курьёзов.
Комментариев нет:
Отправить комментарий