Вот и я, снова с некоторыми концепциями сборки мусора. Пожалуйста, прочтите мою предыдущую статью Сборка мусора, которая может помочь вам лучше понять это.

Island of Isolation - это концепция в java, в которой, даже если ссылка на ваш объект удерживается некоторой переменной, массивом или любыми коллекциями, объект получает право на сборку мусора. Кажется, сейчас это сбивает с толку, не так ли? Тогда давайте проясним это.

Предположим, у нас есть два объекта: object1 и object2.

object1 имеет поле 'a', которое содержит ссылку на object2

Точно так же object2 имеет поле 'b', которое содержит ссылку на object1 .

На рисунке выше obj1.a содержит ссылку на obj2, то есть obj1. a = obj2 и obj2.b содержит ссылку на obj1 т.е. obj2.b = obj1.

Поскольку оба объекта имеют внешние ссылки (obj1 и obj2 содержат свою ссылку), ни один из них сейчас не имеет права на сборку мусора. Здесь нет ничего нового, зачем тогда я пишу эту статью? Пойдем дальше, внесем некоторые изменения, и вы получите ответ.

Пора разыменовать 1-й объект. Как мы это делаем?? Ответ на этот вопрос - "null".

obj1 = null разыменует объект. Это означает, что ссылка obj1 не принадлежит какой-либо части программы. Это верно? Если да, то наш obj1 должен иметь право на сборку мусора. Но это неверно, прямо сейчас ни один из объектов не подходит для сборки мусора. Если вы заметили на диаграмме выше, obj2.b по-прежнему содержит ссылку на 1-й объект. Ссылка на второй объект содержится в 'variable obj2' и 'variable a' 1-го объекта. соответственно. Таким образом, мы можем сказать, что оба объекта здесь все еще имеют внешние ссылки, т.е. оба могут быть доступны программе.

Пора разыменовать второй объект. obj2 = null разыменует второй объект

На диаграмме выше мы видим, что ссылка на 1-й объект удерживается переменной 2-го объекта, а ссылка на 2-й объект удерживается переменной 1-го объекта. В идеале оба объекта не разыменовываются из программы, потому что их ссылки удерживаются некоторой переменной. Итак, зная GC, мы можем заключить, что оба объекта сейчас не имеют права на сборку мусора. Но это неправда, теперь оба объекта подходят для GC. Причина в том, что оба объекта теперь недоступны для внешней программы. Сейчас мы не сможем добраться до любого объекта. Ссылка на второй объект содержится в «переменной a», но не могли бы вы сказать мне, как вы получите доступ к «переменной a» ?? Мы можем получить доступ к «переменной a» из ссылки на 1-й объект, которая содержится в «переменной b» , но опять же, не могли бы вы сказать мне, как вы получите доступ к 'переменной b' ?? Не зацикливайтесь, оба объекта сейчас бесполезны для JVM, потому что вы не можете выполнять с ним какие-либо операции. Итак, JVM, достаточно умная, отметьте их как Сборка мусора.

Я завершу эту статью здесь, надеясь, что у читателей не останется сомнений. Любые вопросы или предложения приветствуются.