我们最近将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是什么,我找不到有关参数的任何信息。
标记栈是在GC标记阶段遍历可达对象图的结构。
JDK-8000244添加了MarkStackSizeMax
参数的范围检查。
上限现在是(max_jint-1)
。
我无法想象需要更大的值的情况,所以我建议简单地删除参数,让JVM选择默认值。最有可能的是,这无论如何都不会影响性能。