Сборщик мусора - один из основных примитивов в мире JAVA. Инструмент, удаляющий из памяти неиспользуемые / недоступные объекты. Говорят, что объект имеет право на сборку мусора, если он не содержит ссылок. Вопреки этому утверждению, есть состояние, в котором объекты могут быть собраны мусором, даже если они содержат ссылку. Такой сценарий известен как Остров изоляции.
Проще говоря, остров изоляции - это сценарий, в котором некоторые объекты содержат ссылки друг на друга, но ни к одному из них нельзя получить доступ через активное приложение, поскольку объекты не имеют внешних сильных ссылок.
Термин «остров изоляции» возникает из-за того, что объекты изолированы для хранения только внутренних ссылок.
Давайте разберемся с примером.
class Demo{ String objName; Demo demo; public Demo(String objName){ this.objName=objName; } public static void main(String... args){ Demo obj1 = new Demo("Object 1"); Demo obj2 = new Demo("Object 2"); // Object obj1 gets a copy of obj2 obj1.demo = obj2; // Object obj2 gets a copy of obj1 obj2.demo= obj1; /* Both the objects holds the internal references of each other at this point*/ // Make the Objects GC eligible by Nullifying the references obj1 = null; /* Change the name of the object obj1 via obj2, So that it is easy to identify when finalize method is invoked*/ obj2.demo.objName = "Object 1 referenced via Object 2"; obj2 = null; // Request GC to garbage collect the objects System.gc(); } @Override /* Overriding finalize method to check which object is garbage collected */ protected void finalize() throws Throwable { System.out.println(this.objName + " garbage collected successfully"); } }
Для демонстрации у нас есть Demo
class. Как вы заметили, у класса Demo есть две переменные экземпляра, одна для хранения имени объекта, а другая для хранения экземпляра Demo
class. Создается два новых экземпляра Demo, и каждому из этих экземпляров назначается копия другого экземпляра класса Demo. т.е. obj1 поддерживает внутреннюю ссылку obj2, а obj2
поддерживает внутреннюю ссылку obj1
. И мы переопределили метод finalize таким образом, чтобы можно было легко узнать имя объектов, собранных в мусоре.
Затем Obj1 был аннулирован, на случай, если вам интересно, что obj1 имеет право на сборку мусора, переоцените его, поскольку obj2 содержит внутреннюю ссылку на obj1, а к obj1 можно получить доступ через obj2.
Наконец, obj2 также был обнулен, поскольку больше нет внешних ссылок, нет возможности получить доступ к этим объектам в приложении. Оба эти объекта собираются сборщиком мусора, что очевидно из того, что метод finalize был вызван дважды вместе с соответствующими им именами объектов.
Это явление, когда объекты собираются в мусоре даже при наличии существующей ссылки, называется «островом изоляции».
Вывод:
Как говорится в статье, GC будет очищать не только объекты, на которые нет ссылок, но и объекты, которые имеют внутреннюю ссылку, но не имеют внешней ссылки. Если у вас есть какие-либо вопросы, напишите мне в Twitter.
Другие статьи о Java Вам могут понравиться
Управление памятью Java
Комплексное введение в виртуальную машину Java (JVM)
Знакомство с виртуальной машиной Java: память Менеджмент
10 статей, которые должен прочитать каждый программист
10 инструментов, которые должен знать каждый разработчик программного обеспечения
10 курсов по структуре данных и алгоритмам для программистов
5 Java и Web Среды разработки Программисты должны изучить
10 инструментов модульного тестирования и тестирования интеграции для разработчиков Java
5 курсов для изучения внутреннего устройства и производительности JVM
Спасибо, что прочитали эту статью. Если вам нравятся эти инструменты, поделитесь ими с друзьями и коллегами на Facebook. Если у вас есть какие-либо вопросы или отзывы, напишите нам.