背景:脚本任务,多线程执行,执行频次非常高;但是执行效率不高,从JVM入手做调优
sh-4.2# jstat -gc 64
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
34048.0 34048.0 0.0 34048.0 272640.0 219162.0 5950720.0 5653530.1 91580.0 88224.0 10200.0 9627.7 923832 88231.524 27146 81424.338 169655.863
ygc同样非常频繁3次/s
查看得知fgc特别频繁,大概4次/min
sh-4.2# jinfo -flags 64
Attaching to process ID 64, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Non-default VM flags: -XX:CICompilerCount=3 -XX:CMSInitiatingOccupancyFraction=70 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=null -XX:InitialHeapSize=6442450944 -XX:+ManagementServer -XX:MaxHeapSize=6442450944 -XX:MaxNewSize=348913664 -XX:MaxTenuringThreshold=6 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=348913664 -XX:OldPLABSize=16 -XX:OldSize=6093537280 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC-XX:+UseParNewGC
排查记录
========================================================
第一次尝试:
思路:增加对象在年轻代的存活时间,尽量让其在年轻代就直接消亡;
1. 调高MaxTenuringThreshold=15;
2. 调高年轻代至整体的3/8
结果:失败;
========================================================
查看配置参数:
-XX:CICompilerCount=3 -XX:CMSInitiatingOccupancyFraction=70 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=null -XX:InitialHeapSize=6442450944 -XX:+ManagementServer -XX:MaxHeapSize=6442450944 -XX:MaxNewSize=348913664 -XX:MaxTenuringThreshold=6 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=348913664 -XX:OldPLABSize=16 -XX:OldSize=6093537280 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC-XX:+UseParNewGC
a. 参数解析:
MaxTenuringThreshold=6
原因
查看文章:https://www.jianshu.com/p/f39cc983a31b原来这是使用CMS的默认配置,在本实例中ygc频率十分高,在此情况下MaxTenuringThreshold应该调高,充分利用年轻代复制算法的速度优势。
解决:
调整MaxTenuringThreshold=15
b. 各块的大小
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 6442450944 (6144.0MB)
NewSi