Java GC: Почему два пространства для выживания

В большинстве обучающих онлайн, мы видим, что они показывают, что в GC есть два оставшихся в живых. В чем состоит необходимость иметь два оставшихся в живых, когда у нас может быть только один? Каково влияние на производительность, имея два оставшихся в живых?

Ответ 1

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

  • сборщик уплотнений на месте;

  • копировальный коллектор.

Копировальный коллектор может работать быстрее и может быть эффективно распараллелен, в основном потому, что он никогда не перезаписывает какие-либо объекты. Он не может достичь этого, не используя одно "активное" и "неактивное" пространство кучи, эти две роли переключения после каждого запуска GC.

Основная конструкция копировального коллектора

Примечание. Следующее - это не описание фактического GC HotSpot, а скорее те его аспектов, которые являются частью оригинального дизайна, представленного в статье ACM 1970 года C.J. Cheney. HotSpot добавляет дополнительные усовершенствования, одним из которых является добавление пространства Eden, объясненного ниже.

При запуске процедуры копирования происходит два пробела:

  • Из пространства: непрерывный блок памяти разбит на две области:
    • выжившие из последнего GC;
    • новые объекты (созданные после последнего GC);
  • В пробел: полностью пуст.

Задача запуска GC состоит в том, чтобы идентифицировать все сохранившиеся объекты в пространстве From и скопировать их в пространство To.

По мере того как пространство "Пространство" создается, пространство "Из" будет полностью эвакуировано, и ему ничего не нужно писать.

Копирование GC однопроходное

Ключевым преимуществом копировального коллектора является то, что он однопроходный: мы просто просматриваем все корни GC, копируем все эти объекты и затем просматриваем эти объекты для дальнейших ссылок, копируя все референты. Мы никогда не пересматриваем какой-либо объект и не нуждаемся в структурах памяти поддержки. (Посмотрите здесь для хорошего объяснения этого).

Первичные указатели

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

Почему третье пространство?

Ваш вопрос: "Почему существуют два оставшихся в живых?" на самом деле было бы лучше сформулировано, "почему отдельное пространство Эдена?".

HotSpot представила пространство Eden как оптимизацию, которая сохраняет потенциал новой области выделения, и делая ставку на результат, что большая часть объектов сразу превратится в мусор. Вы можете посмотреть на Eden как часть памяти, разделяемую между двумя пробелами: часть, которая, вероятно, будет освобождена после следующего GC. Это фактически улучшает использование памяти.