Алгоритм параллельного уплотнения коллектора

У меня два вопроса. И один из них будет в тему :)

1) Я столкнулся с проблемой невозможности найти полную информацию о том, как работают разные сборщики мусора в HotSpot. Но я не говорю об общих описаниях работы сборщика мусора (у нас много такой информации в Интернете), я говорю о конкретных алгоритмах. Я нашел этот технический документ (Управление памятью в виртуальной машине Java HotSpot) http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf. Но у него есть только общие идеи. В нем есть хорошее описание (вероятно, не очень хорошее - см. Мой второй вопрос) алгоритма параллельного уплотнения (я имею в виду параллельное сжатие с меткой-разверткой), но оно не объясняет другие алгоритмы сборщика мусора. Однако этот технический документ - лучшая информация, которую мне удалось найти в Интернете. Я хотел бы знать, где получить полное описание / информацию о том, как работают разные сборщики мусора (для молодого поколения я имею в виду: ParNew, DefNew, PSYoungGen; для старого поколения: PSOLdGen, ParOldGen, Concurrent-Mark-Sweep). Не могу поверить, что эта информация недоступна пользователям.

2) Вопрос по алгоритму Parallel Compacting Collector (ParOldGen или Parallel Mark-Sweep-Compact). В техническом документе (см. Первый вопрос) есть описание его работы. Позвольте мне вставить цитату из технического документа (пожалуйста, уделите минуту, чтобы взглянуть на него): введите описание изображения здесь

То, что я не могу понять, перечислено ниже:

Что касается итоговой фазы:

  • # P6 #

Что ж, означает ли это, что когда у нас есть область, которая состоит из 98-99% живых объектов и 2-1% мертвых объектов (другими словами, очень небольшой процент мертвых объектов), то уплотнение этой области не стоит пространство, которое можно было бы извлечь из такого региона. Однако эти крошечные свободные пространства (дыры) в конечном итоге будут заполнены, и после завершения сборки мусора дыр не останется.

  • # P8 #

ну, если у нас большой процент мертвых объектов, то эту область стоит уплотнять, не так ли?

  • # P10 #

«и никакие объекты не перемещаются в этих областях», но в этих областях может быть немного свободного места, я прав? Не могу понять сути

  • # P12 #

Уточните пожалуйста, как они будут уплотняться. Каждый регион будет уплотняться отдельно? Думаю, нет. Так что, может быть, здесь будет какое-то смещение?

  • # P14 #

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

Что касается фазы уплотнения:

  • # P17 #

Я совершенно запуталась. Значит, на «итоговой фазе» уплотнения не произошло? Была ли цель предыдущей фазы только найти все свободные места?

Пожалуйста, помогите мне получить четкое представление.


person Anton Kasianchuk    schedule 06.12.2013    source источник
comment
Я не знаю, как они работают, и сам не делал этого, но, возможно, вам будет полезно прочитать код сборщика мусора в OpenJDK.   -  person tmyklebu    schedule 06.12.2013
comment
Я предполагаю, что даже люди, которые обслуживают этот материал, не знают, как это работает, и слишком сложно (и непостоянно) написать книгу, которая точно описывает каждый нюанс каждого алгоритма. Я подозреваю, что вы ищете больше подробностей, чем когда-либо возможно.   -  person Hot Licks    schedule 06.12.2013
comment
Однако эти крошечные свободные пространства (дыры) в конечном итоге будут заполнены, и после завершения сборки мусора дыр не останется. Не так, как я понимаю. Hotspot - это не обычная куча. Отверстия не заполняются. Вместо этого нужно ждать, пока вся область уплотняется. Сжатие для большинства областей Hotspot подразумевает копирование всех объектов из старого пространства в новое пространство с пропуском отверстий. Hotspot - это, по большей части, сборщик остановок и копий.   -  person Hot Licks    schedule 06.12.2013
comment
(Есть две принципиально разные формы сборки мусора: остановка и копирование и свободный список. Версия бесплатного списка похожа на обычный диспетчер кучи, где освобожденные выделения добавляются в список для перераспределения. Остановка и копирование, с другой стороны, физически копирует объекты из области A в область B, пропуская отверстия, затем начинает размещать новые объекты в теперь пустой области A. HotSpot, по большей части, останавливает и копирует.)   -  person Hot Licks    schedule 06.12.2013


Ответы (2)


Это просто общее описание алгоритма. Такие описания могут быть разной детализации. В этом случае он дает вам больше информации, но все же оставляет некоторые варианты выбора для разработчика.

По поводу ваших вопросов:

  1. So no compaction happened on the "summary phase"? Was the previous phase's purpose only to find all free spaces? - Да, это правильно. На этапе сводки собираются данные индексации и в основном определяется все необходимое, чтобы затем на этапе уплотнения можно было выполнить копирование. Они не говорят, как они реализуют уплотнение, но по умолчанию каждый живой объект просто помещается рядом с предыдущим объектом. По сути, все пустое пространство удаляется, и после завершения этапа уплотнения у вас остается один непрерывный фрагмент памяти, содержащий все живые объекты. Я вижу ваше недоразумение с четвертой частью, но обратите внимание, что она написана в будущем времени: «будет уплотнено» - так что не во время подведения итогов, а позже.
  2. Does it mean [...] compacting of this region in not worth the space that could be recovered from such a region? Да, верно. По сути, вы теряете часть места, но очень часто память жертвуется на скорость выполнения. Точный порог плотности зависит от реализации, но я бы оценил пороговое значение отношения используемой памяти к общему объему памяти примерно на уровне 70-90%.

Если вы хотите знать все грязные детали, взгляните на реализации виртуальной машины с открытым исходным кодом, как это предлагается в комментариях.

person Domi    schedule 06.12.2013

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

Лучшее решение - использовать профилировщик памяти и уменьшить скорость выделения памяти. Никакая настройка или вмешательство в параметры командной строки (если у вас нет неправильно настроенного сборщика мусора) не сравнится с уменьшением этой скорости распределения.

Однако отвечу на ваши вопросы.

параллельная метка-развертка-компактная

Нет такого такого. Это параллельный сборщик, который сжимает, а параллельный сборщик меток - нет. Существует также коллектор G1, который не является поколением аналогичным образом. т.е. собирает как молодые, так и старые предметы.

Не могу поверить, что эта информация не актуальна для пользователей.

По задумке разработчику не нужно знать такие подробности. Также не стоит чрезмерно настраивать ваше приложение, потому что это делает его очень уязвимым для изменений в приложении или JVM.

Что я хотел бы знать, так это где получить полное описание / информацию о том, как разные сборщики мусора

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

Каждый регион будет уплотняться отдельно? Думаю, нет. Так что, может быть, здесь будет какое-то смещение?

Уплотняется только жилое пространство. Молодые регионы копируются многократно и никогда не нуждаются в уплотнении.

Значит, на «итоговой фазе» уплотнения не произошло? Была ли цель предыдущей фазы только найти все свободные места?

На этапе уплотнения выполняется максимальное копирование на один конец области без ее полной дефрагментации. Это оставляет один конец с некоторыми объектами (в основном, большими, как мне кажется), а другой конец очень плотным.

person Peter Lawrey    schedule 06.12.2013
comment
Будьте дизайном, разработчику не нужно знать эти подробности. Только в модели, где разработчики должны заботиться только о формальной семантике своих программ Java, а не о тех реальных эффектах (потребление времени и пространства), которые не охватываются формальной семантикой. - person tmyklebu; 06.12.2013
comment
@tmyklebu На самом деле им нужно иметь какое-то представление, но если вам нужно точно знать, как работает уплотнение, вы сделали что-то не так, ИМХО. Обычно добавление еще нескольких ГБ в кучу решает эту проблему, намного дешевле в долгосрочной перспективе (1 ГБ стоит 3 доллара) и занимает гораздо меньше времени. - person Peter Lawrey; 06.12.2013
comment
Знание того, как что-то работает, позволяет вам раскрыть его сильные стороны. Просто купить больше оперативной памяти - не всегда вариант; современные материнские платы имеют очень ограниченную способность принимать накопители ОЗУ и использовать их. Увеличение кучи может увеличить паузы сборщика мусора, что отрицательно скажется на задержке. (Хотя я согласен с тем, что вы находитесь в состоянии глубокого греха, если такого рода детали сделают или сломают ваш проект, и вы не откажетесь от среды GC.) - person tmyklebu; 06.12.2013
comment
Не могли бы вы взглянуть на мой другой вопрос stackoverflow.com/questions/21809922/, возможно, вы сможете мне помочь - person Anton Kasianchuk; 16.02.2014