提问者:小点点

JVM中的CMSMarkStackSizeMax参数


我们最近将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时,我们在日志中收到以下错误

JavaHotSpot(TM)64位服务器VM警告:忽略选项MaxPermSize=384m;8.0中删除了支持

5368709120的MarkStackSizeMax无效;必须介于1和2147483646之间错误:无法创建Java虚拟机。错误:发生致命异常。程序将退出。

MarkStackSize有什么问题,为什么当相同的5G值在JDK1.7中正常工作时,我们需要将其减少到2 GB以下?

除此之外,MarkStackSize是什么,我找不到有关参数的任何信息。


共1个答案

匿名用户

标记栈是在GC标记阶段遍历可达对象图的结构。

JDK-8000244添加了MarkStackSizeMax参数的范围检查。
上限现在是(max_jint-1)

我无法想象需要更大的值的情况,所以我建议简单地删除参数,让JVM选择默认值。最有可能的是,这无论如何都不会影响性能。