Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Как будет работать GC

#java #сборщик_мусора


Рассмотрим случай, когда объект хранит ссылку на самого себя. Ну например что-то
вроде такого

public class A {

   private A a;

   public A() {
      a = this;
   }
}


Каким в данном случае будет жизненный цикл объектов данного класса? GC не трогает
объекты до тех пор, пока есть ссылки на них. Следует ли из этого то, что объекты этого
класса как минимум будут храниться в памяти до тех пор, пока я не присвою переменной
a значение null?
    


Ответы

Ответ 1



Объекты не удаляются до тех пор пока они "достижимы" (доступны по ссылкам) от так называемого "корня" (GC root). Ссылки не достижимые от корня в том числе и циклические ссылки не являются препятствием для сборки мусора. В зависимости от варианта используемого алгоритма сборки мусора, есть различия в том, какие стадии сборки и в какой момент запускаются и по какому признаку объекты разделены на так называемые "поколения"(generations), однако упрощенная схема сборки примерно одна для большинства сборщиков: Объекты помечаются как достижимые (MARK) GC кушает недостижимые объекты (SWEEP) Визуализация примерной схемы работы алгоритма Garbage Collector использующего алгоритм из подмножества Mark-Sweep

Комментариев нет:

Отправить комментарий