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