Сборщик мусора - один из основных примитивов в мире 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. Если у вас есть какие-либо вопросы или отзывы, напишите нам.