Что такое уплотнение в Java GC?

#java #garbage-collection

#java #сборка мусора

Вопрос:

Я прочитал http://www.cubrid.org/blog/tags/Garbage Collection статья, которая дает высокоуровневую картину GC в Java. В нем говорится:

Задача уплотнения заключается в устранении фрагментации памяти путем уплотнения памяти, чтобы удалить пустое пространство между выделенными областями памяти.

Следует ли перемещать объекты в другие места, чтобы заполнить пробелы?

Я думаю, что объекты перемещаются. Если это так, то это означает, что адреса изменены, и поэтому ссылка на этот объект также должна быть обновлена?

Найти все обратные ссылки и обновить их кажется слишком сложной задачей…

Ответ №1:

Да, произвольные объекты произвольно перемещаются по памяти, и да, это требует обновления ссылок на эти объекты. Можно было бы также использовать косвенное обращение, но у этого есть различные недостатки, и я не знаю ни одного высокопроизводительного GC, делающего это.

Это действительно несколько сложно, но что касается оптимизации GC, то она довольно щадящая. Базовая система mark-compact работает довольно хорошо, и она в основном просто перебирает все объекты в порядке адресов, перемещает их по наименьшему доступному адресу и по ходу работы создает «таблицу прерываний», которая содержит необходимую информацию (начальный адрес -> смещение) для быстрого исправления ссылок, что затем выполняется за второй проход. Ничто из этого не требует информации или ведения бухгалтерского учета сверх того, что уже требуется любому сборщику меток (типы объектов, расположение ссылок и т.д.).

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