qps达到十几w,导致服务器一直OOM然后程序被服务器kill
排查步骤:
- 增加节点并扩容资源
- 启动参数增加调整以下配置(无用)
- -XX:+UseG1GC \
-XX:G1HeapRegionSize=16m \ # Region大小(16-32m,大对象多可增大)
-XX:MaxGCPauseMillis=200 \ # 目标最大停顿时间(根据业务容忍度调整)
-XX:G1NewSizePercent=5 \ # 新生代最小占比(默认5%)
-XX:G1MaxNewSizePercent=60 \ # 新生代最大占比(高并发临时对象多,可提高)
-XX:G1ReservePercent=15 \ # 预留内存(避免晋升失败,默认10%,高并发建议15%)
- -XX:+UseG1GC \
- 优化并限制jetty连接数与队列(无用)
- 再次调整启动参数以下配置(无用)
- # 启用CMS收集器(老年代)
-XX:+UseConcMarkSweepGC
# 新生代使用ParNew收集器(与CMS配合最佳)
-XX:+UseParNewGC - # 老年代占用率达到70%时触发CMS(默认约92%,高并发需提前)
-XX:CMSInitiatingOccupancyFraction=70
# 禁止JVM动态调整触发阈值(严格按上面的70%执行)
-XX:+UseCMSInitiatingOccupancyOnly - # 重新标记阶段并行化(多线程处理,默认单线程)
-XX:+CMSParallelRemarkEnabled
# 开启“初始标记”阶段的并行化(针对G1引入的优化,部分JDK版本支持CMS)
-XX:+CMSScavengeBeforeRemark - # 新生代ParNew的并行GC线程数(建议=CPU核心数,如8核设8)
-XX:ParallelGCThreads=8
# CMS并发线程数(建议=ParallelGCThreads的1/4 ~ 1/2,避免占用过多CPU)
-XX:ConcGCThreads=2
- # 启用CMS收集器(老年代)
- 调整GC配置方式,限制堆外内存(有用)
- -XX:+UseG1GC -XX:MaxDirectMemorySize=10G
- 升级jdk11(有用)
解决步骤:
- 升级jdk版本至11.0.2
- 优化启动配置
- 替换新war包(可不替换,仅修改了日志打印)
jdk-11.0.2_linux-x64_bin.tar.gz
调整项:
1. | 增加jdk配置 | export LC_ALL=en_US.UTF-8 export JAVA_HOME=/home/hadoop/jdk-11.0.2 export PATH=$JAVA_HOME/bin:$PATH | |
2. | 调整启动参数,增加堆外内存限制、堆转储配置、并调整GC方式为UseG1GC | -XX:+UseG1GC -XX:MaxDirectMemorySize=10G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/hadoop/dmp-ad-frontend-server/logs/java_heap_dump.hprof | 修改前:JAVA_OPTIONS=(${JAVA_OPTIONS[*]} “-Djetty.home=$JETTY_HOME” “-Djetty.base=$JETTY_BASE” “-Djava.io.tmpdir=$TMPDIR” “-Xms40G -Xmx40G -XX:+UseConcMarkSweepGC”) 修改后:JAVA_OPTIONS=(${JAVA_OPTIONS[*]} “-Djetty.home=$JETTY_HOME” “-Djetty.base=$JETTY_BASE” “-Djava.io.tmpdir=$TMPDIR” “-Xms40G -Xmx40G -XX:+UseG1GC -XX:MaxDirectMemorySize=10G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/hadoop/dmp-ad-frontend-server/logs/java_heap_dump.hprof”) |
常用操作指令
查看服务gc情况 | jstat -gc 进程号看倒数第二列:gc次数 和 倒数第三列:gc时长![]() |
查看网络连接数 | netstat -anolp |wc -l![]() |