jdk11 zgc进程coredump解决(针对大内存的zgc参数设置)

背景

某线上服务,使用的机器配置: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个参数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容