как выясняются живые объекты в коллекции молодого поколения? - PullRequest
8 голосов
/ 03 октября 2010

Я понимаю, что время, затраченное YGC, пропорционально количеству живых объектов в Эдеме. Я также понимаю, что как живые объекты вычисляются в основных коллекциях (все объекты в стеках потоков и статические объекты и другие объекты, достижимые из этих объектов транзитивно.)

Но я не понимаю, как живые объекты обнаруживаются в коллекции молодого поколения? если он анализирует стеки потоков, то он должен анализировать пространство eden + tenured, что, на мой взгляд, не так. Так как же JVM находит живые объекты в eden и копирует их в To Survivor пространстве?

Ответы [ 3 ]

8 голосов
/ 03 октября 2010

как вычисляются живые объекты в коллекции молодого поколения?

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

Как правило, сборщик поколений помечает молодое поколение следующим образом (при условии, что у нас всего два поколения):

  1. Он маркирует молодые объекты и отслеживает ссылки, начиная с потокакадры стека и статические кадры.Когда он находит ссылку на объект старого поколения, он игнорирует его.
  2. Затем он повторяет процесс для ссылок в старом поколении, которые ссылаются на объекты молодого поколения.Хитрый бит идентифицирует эти ссылки в старом поколении без маркировки всего старого поколения.
  3. Теперь мы отметили все объекты в новом поколении, которые достижимы ... иостальные (в этом поколении) могут быть восстановлены.

В HotSpot объекты старого поколения, содержащие ссылки молодого поколения, идентифицируются с помощью «Таблицы карт».Старое поколение делится на области по 512 байт, и у каждого региона есть «Карта».Если область содержит какие-либо старые -> указатели нового поколения, бит в Карте установлен.Объекты в регионах с установленным битом Карты затем отслеживаются во время коллекции нового поколения.

Хитрость заключается в том, чтобы поддерживать таблицу карт, поскольку новые ссылки на пробелы записываются в объекты старого поколения.В HotSpot это реализуется с помощью программного барьера записи, который устанавливает грязный бит соответствующей Карты, когда новая ссылка на пространство записывается в область памяти, соответствующую Карте.Как отмечается в связанной статье, это делает настройку ссылочного поля в объекте более дорогой, но, очевидно, оно того стоит из-за экономии времени благодаря возможности собирать только новое поколение большую часть времени.

3 голосов
/ 03 октября 2010

Чтобы отследить только самое молодое поколение, сборщик мусора сканирует тот же корневой набор (стеки и регистры) и ТАКЖЕ все старшие (не собранные) поколения, которые были изменены со времени предыдущего сканирования молодого поколения. Только те объекты, которые были изменены, могут указывать на объекты молодого поколения, поскольку немодифицированные объекты не могут указывать на объекты, которые были созданы после их последней модификации.

Итак, самое сложное в том, как GC узнает, какие объекты были изменены с момента последнего GC? Существует ряд методов, которые можно использовать, но в основном они сводятся к отслеживанию записей в объекты старого поколения. Это можно сделать, перехватывая записи (барьеры записи) или просто отслеживая все цели записи (буферы записи, разметка карт), и все это увеличивает накладные расходы при выполнении программы, пока GC не работает (так что это не делает отображается как время паузы ГХ, но отображается в общем истекшем времени). Аппаратная поддержка очень помогает, если она доступна. Отслеживание не обязательно должно быть точным, если сканируется каждый измененный объект более старого поколения (сканирование неизмененных объектов - пустая трата времени, но ничего не повредит).

1 голос
/ 03 октября 2010

Я цитирую соответствующий текст из статьи Брайана Гетца здесь.

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

...