Параметр CMSMarkStackSizeMax в JVM 8

Недавно мы изменили версию JDK с 1.7 на 1.8.

Мы запускаем обычный процесс JVM с указанными ниже аргументами памяти, пожалуйста, ниже приведен лишь их фрагмент.

MEM_ARGS = "-DTENURED_SIZE=5G -Xms10G -Xmx10G -DCONSERVATIVE_ZONE=0 -DMEMORY_PANIC_DISABLE=YES "
-XX:+UseParNewGC -XX:NewSize=256m -XX:MaxNewSize=256m -XX:SurvivorRatio=3
GC_ARGS = "-XX:-UseBiasedLocking -XX:+CMSPrecleanRefLists1 " 
GC_ARGS = "$GC_ARGS -XX:+CMSPrecleanRefLists2 " 
GC_ARGS = "$GC_ARGS -XX:+CMSClassUnloadingEnabled " 
GC_ARGS = "$GC_ARGS -XX:+CMSScavengeBeforeRemark " 
GC_ARGS = "$GC_ARGS -XX:PrintCMSStatistics=2 " 
GC_ARGS = "$GC_ARGS -XX:+UseCMSInitiatingOccupancyOnly " 
GC_ARGS = "$GC_ARGS -XX:CMSMarkStackSize=4m  "
GC_ARGS = "$GC_ARGS -XX:CMSMarkStackSizeMax=5G " 
GC_ARGS = "$GC_ARGS -XX:ParGCDesiredObjsFromOverflowList=20k " 
GC_ARGS = "$GC_ARGS -XX:+UseConcMarkSweepGC  "
GC_ARGS = "$GC_ARGS -XX:CMSInitiatingOccupancyFraction=40 " 
GC_ARGS = "$GC_ARGS -XX:+PrintGCApplicationStoppedTime  "
GC_ARGS = "$GC_ARGS -XX:-OmitStackTraceInFastThrow  "

Когда мы запускаем JVM, мы получаем следующую ошибку в нашем журнале

Предупреждение виртуальной машины 64-разрядного сервера Java HotSpot (TM): игнорирование параметра MaxPermSize = 384m; поддержка была удалена в 8.0

MarkStackSizeMax of 5368709120 is invalid; must be between 1 and 2147483646 Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.

В чем проблема с MarkStackSize, почему нам нужно уменьшить его до менее 2 ГБ, когда такое же значение 5G работало нормально в JDK1.7?

Кроме того, что такое MarkStackSize, я не смог найти никакой информации о параметре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
442
1

Ответы 1

Стек маркировки - это структура для обхода графа достижимых объектов на этапе маркировки сборки мусора.

JDK-8000244 добавил проверку диапазона для аргумента MarkStackSizeMax. верхний предел теперь (max_jint - 1).

Я не могу представить себе случай, когда может потребоваться большее значение, поэтому я предлагаю просто удалить аргумент и позволить JVM выбрать значение по умолчанию. Скорее всего, это все равно не повлияет на производительность.

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