Будет ли jvm old gc пометить всю кучу или просто старая куча? - PullRequest
0 голосов
/ 21 января 2019

Будет ли jvm old gc отмечать всю кучу или просто старую кучу?Потому что объекты молодого поколения могут содержать объекты старого поколения.

1 Ответ

0 голосов
/ 30 января 2019

Это зависит от используемого вами сборщика.

Некоторые сборщики не используют какую-либо структуру для записи ссылок от молодого поколения к старому поколению.Теоретически, эти сборщики должны сканировать молодое поколение, чтобы найти мусор.Тем не менее, некоторые сборщики будут выполнять младшую сборку вместо сканирования молодого поколения.Как и CMS (Concurrent Mark Sweep), он будет сканировать молодое поколение.Но вы можете использовать опции

-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark 

, чтобы собрать молодое поколение перед выполнением полной фазы gc или CMS.

Но некоторым сборщикам не нужно сканировать молодое поколение.Они обычно используют некоторые структуры данных для записи ссылок, например, сборщик G1 (Garbage First).Он использует RS (запомни набор).Коллектор G1 будет сканировать RS, чтобы найти ссылку.Например, если есть молодой регион с вызовом yr1, имеет ссылку на объект в старом регионе or1.RS добавит запись типа:

yr1 -> or1

(Реальная реализация RS действительно сложна). Таким образом, в цикле отметок G1 будет сканировать RS, чтобы найти все контрольные точки для or1.

Подробнее:

...