背景
某线上服务,使用的机器配置:cpu64核、内存384G
为了减少gc带来的影响,使用了jdk11+zgc,其中jvm堆配置为301G,详细的jvm参数配置如下:
/usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -server -Djava.awt.headless=true -Dsun.reflect.inflationThreshold=2147483647 -Xms301G -Xmx301G -Xss512k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=256m -XX:InitialCodeCacheSize=256m -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -XX:ConcGCThreads=19 -XX:ParallelGCThreads=44 -XX:ZCollectionInterval=120 -XX:ZAllocationSpikeTolerance=5 -XX:+UnlockDiagnosticVMOptions -XX:-ZProactive -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+ExplicitGCInvokesConcurrent -XX:-OmitStackTraceInFastThrow -XX:AutoBoxCacheMax=20000 -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xlog:gc*=info,safepoint,gc+heap=trace:file=/data/applogs/heap_trace.txt:t,u,level,tags:filecount=5,filesize=100M -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/HeapDumpOnOutOfMemoryError -Djava.util.Arrays.useLegacyMergeSort=true -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Duser.region=CN -Djava.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
线上稳定运行一段时间后,随着流量增加,jvm进程经常coredump(jvm进程突然崩溃)
将进程重启后,过一段时间(大约1天 ~几天)又会出现coredump
1. max_map_count参数修改
进程coredump后,生成了下面的tomcat日志:
需要将系统参数 /proc/sys/vm/max_map_count 修改为655300,参考:https://cloud.tencent.com/developer/news/840984
2. ZMarkStacksMax参数修改
部分进程coredump后,也生成了如下的日志:
增加gc参数:-XX:ZMarkStacksMax=20480M,参考:https://cloud.tencent.com/developer/news/840984
临时调大该参数可缓解
总结
经过上面2个参数调整后,进程coredump不再发生了。
对于使用jdk11的zgc来讲,如果进程设置的堆空间比较大(超过100G),强烈建议设置上面2个参数