Изменение размера кучи 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
его визуальная таблица использования кучи:
Общий размер кучи составляет ровно 2 г, а красная линия устойчива по горизонтали, и я думаю, что так и должно быть.
Основное различие между этими двумя приложениями заключается в используемой стратегии GC, одно - параллельное GC, а другое - CMS. Влияет ли стратегия GC на изменение размера пространства кучи? Или параметр -Xmn влияет на изменение размера кучи, чего я не знал?
1 ответ
Parallel GC выполняет некоторые трюки с помощью так называемой эргономики GC, которая пытается изменить размеры внутреннего кучи (OLD, new, perm и т. Д.) Во время выполнения, чтобы помочь в достижении пропускной способности или целей задержки.
Вполне возможно, что инструмент мониторинга не ожидает увидеть изменение размеров кучи и сообщает об этих изменениях напрямую, а не сглаживает их.