Несколько сборщиков мусора в 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, но, похоже, нет ссылки на использование нескольких коллекторов в одном пуле.
Ответы
Ответ 1
Я предполагаю, что у них есть перекрывающиеся пулы.
Это предположение неверно. PS Scavenge будет использоваться для поколения молодых (eden, survivor), а PS MarkSweep будет использоваться для старого поколения. Единственным "перекрытием" является то, что PS Scavenge будет перемещать объекты в прежнее поколение, когда они были вокруг, и пусть PS MarkSweep справится с ними тогда.
Преимущество использования разных сборщиков мусора для разных пулов заключается в том, что алгоритм, который хорошо работает для объектов в пуле eden, не обязательно будет хорошо работать для объектов старого поколения.
В этой статье рассматриваются различные варианты работы разных сборщиков мусора.
Что касается "основных" коллекций, которые возникают, когда нет места для перемещения объектов в старое поколение, этот (по общему признанию, старый) документ от Sun говорит следующее
... алгоритм сбора молодого поколения не запускается. Вместо этого алгоритм сбора старого поколения используется во всей куче.
Ответ 2
Создайте статью, которую вы предоставили:
Обычно какая-то часть выживших объектов от молодых поколение переносится в поколение в течение каждого несовершеннолетнего коллекция. В конце концов, поколение поколений будет заполнено и должно собираются, в результате чего создается крупный сбор, в котором весь куча собрана. Основные коллекции обычно продолжаются намного дольше, чем второстепенные коллекции, поскольку значительно большее количество объектов участие.