Почему сборщик мусора Java CMS не позволяет размеру используемой кучи увеличиваться до доступного размера кучи?

Я тестирую различия между G1GC и сборщиками мусора CMS. Запуск одной и той же программы приводит к использованию разного размера кучи (возможно, как и ожидалось).

На изображении ниже показано сравнение G1GC (слева) и CMS GC (справа). G1GC удается запустить всю программу, тогда как при использовании CMS возникает outOfMemoryException.

введите здесь описание изображения

Следовательно, мой вопрос: почему CMS не позволяет используемому размеру кучи достигать доступного размера кучи? Размер кучи перестает расти на уровне 8,00 ГБ с исключением нехватки памяти, когда доступно 10 ГБ.


person rrz0    schedule 05.10.2020    source источник


Ответы (1)


Короткий ответ заключается в том, что CMS не так хороша, как управление памятью при переполнении кучи, как это делает G1GC. Это одна из причин отказа от CMS.

Чуть более длинный ответ заключается в том, что 2 ГБ неиспользуемого пространства в CMS зарезервированы для эвакуации объектов в второстепенных (копирующих) GC пространства Eden. Напротив, G1GC, похоже, может регулировать (сокращать) пространство Eden по мере заполнения пространства Tenured.

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

Что вы можете с этим поделать?

  1. Переключитесь на G1GC. В большинстве случаев это лучше, чем CMS. (В конце концов у вас не будет выбора. CMS устарела в Java 9 и была удалена в Java 14.)

  2. Вы можете уменьшить размер пространства Eden: специально настроить NewSize и MaxNewSize. Однако это имеет недостатки для нормальной рабочей нагрузки. Это может привести к тому, что молодые объекты будут переданы в аренду слишком рано, что увеличит нагрузку на сборщик CMS.

  3. Есть более новые сборщики, которые лучше работают с полными кучами.

person Stephen C    schedule 05.10.2020
comment
MaxNewSize и NewSize будут что-то значить только в том случае, если вы также отключите адаптивную политику G1, что редко (если вообще когда-либо) является тем, что вы хотите делать. - person Eugene; 08.10.2020
comment
@Eugene Евгений - я говорил о случае с CMS. (Хотя я не говорю, что это хорошая идея...) - person Stephen C; 08.10.2020