Изменение размера кучи jvm, когда -Xmx и -Xms одинаковы

У меня есть отдельное Java-приложение, параметры которого jvm:

-Xmx2g -Xms2g -Xmn1g -XX:PermSize=96m -XX:+DisableExplicitGC 
-XX:+UseFastAccessorMethods  -XX:+UseParallelGC -XX:+UseParallelOldGC 
-XX:MaxTenuringThreshold=63 -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true

как мы видим, -Xmx и -Xms - все 2g, но я обнаружил, что размер кучи всегда немного изменяется:красная линия представляет общий размер кучи, синяя представляет использованный

красная линия представляет общий размер кучи, синяя представляет использованный. Я думаю, что красная линия должна быть прямой, но это не так. Но в другом веб-приложении, которые являются параметрами jvm:

-Xmx2g -Xms2g -Xmn512m -XX:PermSize=196m -Xss256k -XX:+DisableExplicitGC 
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly 
-XX:CMSInitiatingOccupancyFraction=70 -XX:-ReduceInitialCardMarks 
-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true

его визуальная таблица использования кучи:

куча не изменяет размер, когда cms gc

Общий размер кучи составляет ровно 2 г, а красная линия устойчива по горизонтали, и я думаю, что так и должно быть.

Основное различие между этими двумя приложениями заключается в используемой стратегии GC, одно - параллельное GC, а другое - CMS. Влияет ли стратегия GC на изменение размера пространства кучи? Или параметр -Xmn влияет на изменение размера кучи, чего я не знал?

1 ответ

Parallel GC выполняет некоторые трюки с помощью так называемой эргономики GC, которая пытается изменить размеры внутреннего кучи (OLD, new, perm и т. Д.) Во время выполнения, чтобы помочь в достижении пропускной способности или целей задержки.

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

Другие вопросы по тегам