В большинстве обучающих онлайн, мы видим, что они показывают, что в GC есть два оставшихся в живых. В чем состоит необходимость иметь два оставшихся в живых, когда у нас может быть только один? Каково влияние на производительность, имея два оставшихся в живых?
Java GC: Почему два пространства для выживания
Ответ 1
Причина в том, что вы угадываете это правильно, производительность. Позвольте мне сначала объяснить, почему существуют оставшиеся в живых пространства. Существует два основных проекта сборщика мусора в отношении существенной проблемы перемещения объекта:
-
сборщик уплотнений на месте;
-
копировальный коллектор.
Копировальный коллектор может работать быстрее и может быть эффективно распараллелен, в основном потому, что он никогда не перезаписывает какие-либо объекты. Он не может достичь этого, не используя одно "активное" и "неактивное" пространство кучи, эти две роли переключения после каждого запуска GC.
Основная конструкция копировального коллектора
Примечание. Следующее - это не описание фактического GC HotSpot, а скорее те его аспектов, которые являются частью оригинального дизайна, представленного в статье ACM 1970 года C.J. Cheney. HotSpot добавляет дополнительные усовершенствования, одним из которых является добавление пространства Eden, объясненного ниже.
При запуске процедуры копирования происходит два пробела:
- Из пространства: непрерывный блок памяти разбит на две области:
- выжившие из последнего GC;
- новые объекты (созданные после последнего GC);
- В пробел: полностью пуст.
Задача запуска GC состоит в том, чтобы идентифицировать все сохранившиеся объекты в пространстве From и скопировать их в пространство To.
По мере того как пространство "Пространство" создается, пространство "Из" будет полностью эвакуировано, и ему ничего не нужно писать.
Копирование GC однопроходное
Ключевым преимуществом копировального коллектора является то, что он однопроходный: мы просто просматриваем все корни GC, копируем все эти объекты и затем просматриваем эти объекты для дальнейших ссылок, копируя все референты. Мы никогда не пересматриваем какой-либо объект и не нуждаемся в структурах памяти поддержки. (Посмотрите здесь для хорошего объяснения этого).
Первичные указатели
Поскольку каждый выживший объект перемещается, старое местоположение может быть помечено указателем пересылки, и эта информация затем может быть эффективно использована, поскольку выжившие объекты сканируются для ссылок на перемещенные объекты, и эти ссылки обновляются. Старая ссылка указывает на указатель вперед, чтобы новое значение указателя находилось только в одном направлении.
Почему третье пространство?
Ваш вопрос: "Почему существуют два оставшихся в живых?" на самом деле было бы лучше сформулировано, "почему отдельное пространство Эдена?".
HotSpot представила пространство Eden как оптимизацию, которая сохраняет потенциал новой области выделения, и делая ставку на результат, что большая часть объектов сразу превратится в мусор. Вы можете посмотреть на Eden как часть памяти, разделяемую между двумя пробелами: часть, которая, вероятно, будет освобождена после следующего GC. Это фактически улучшает использование памяти.