Подтвердить что ты не робот

Несколько сборщиков мусора в java

Каждый процесс java, который я запускаю на моей машине, по умолчанию имеет 2 сборщика мусора. Я проверяю это через JConsole.

Пример - для моего текущего затмения.

PS MarkSweep

Collection Count - 221
Collection Time - 102118
Memory Pool Names - java.lang.String[4]

PS Scavenge

Collection Count - 241
Collection Time - 2428
Memory Pool Names - java.lang.String[2]

Я предполагаю, что у них перекрывающиеся пулы. Как два сборщика мусора работают вместе, используя одни и те же пулы (Eden, survivor, old gen)? Нет ли совпадений в перемещении объектов между пулами (например, движение от одного выжившего к другому при вызове второго алгоритма)? Даже если это не так, почему нам нужно больше, чем один коллекционер на пул?

Я прочитал эту статью о GC. Они относятся к использованию разных коллекционеров для разных основных и младших GC, но, похоже, нет ссылки на использование нескольких коллекторов в одном пуле.

4b9b3361

Ответ 1

Я предполагаю, что у них есть перекрывающиеся пулы.

Это предположение неверно. PS Scavenge будет использоваться для поколения молодых (eden, survivor), а PS MarkSweep будет использоваться для старого поколения. Единственным "перекрытием" является то, что PS Scavenge будет перемещать объекты в прежнее поколение, когда они были вокруг, и пусть PS MarkSweep справится с ними тогда.

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

В этой статье рассматриваются различные варианты работы разных сборщиков мусора.

Что касается "основных" коллекций, которые возникают, когда нет места для перемещения объектов в старое поколение, этот (по общему признанию, старый) документ от Sun говорит следующее

... алгоритм сбора молодого поколения не запускается. Вместо этого алгоритм сбора старого поколения используется во всей куче.

Ответ 2

Создайте статью, которую вы предоставили:

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