1. 使用G1垃圾收集器
修改配置参数,获取到gc日志,使用GCViewer分析吞吐量和响应时间
-XX:+UseG1GC
Throughput Min Pause Max Pause Avg Pause GC count 99.16%
0.00016s 0.0137s 0.00559s 12
2. 调整内存大小再获取gc日志分析
-XX:MetaspaceSize=100M
-Xms300M -Xmx300M
Throughput Min Pause Max Pause Avg Pause GC count 98.89%
0.00021s 0.01531s 0.00538s 12
3. 比如设置大停顿时间,获取到gc日志,使用GCViewer分析吞吐量和响应时间
-XX:MaxGCPauseMillis=200 设置大GC停顿时间指标
Throughput Min Pause Max Pause Avg Pause GC count 98.96%
0.00015s 0.01737s 0.00574s 12
4. 比如设置大停顿时间,获取到gc日志,使用GCViewer分析吞吐量和响应时间
-XX:InitiatingHeapOccupancyPercent=45
#G1用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内 存的使用比例。值为 0 则表示“一直执行GC循环)'. 默认值为 45 (例如, 全部的 45% 或者使用了45%).
Throughput Min Pause Max Pause Avg Pause GC count 98.11%
0.00406s 0.00532s 0.00469s 12
G1 调优的最佳实战
1. 不要手动设置新生代和老年代的大小,只要设置整个堆的大小;
G1收集器在运行过程中,会自己调整新生代和老年代的大小 其实是通过adapt代的大小来调整对象晋升的速度和年龄,从而达到为收集器设置的暂停时间目标 如果手动设置了大小就意味着放弃了G1的自动调优
2. 不断调优暂停时间目标
一般情况下这个值设置到100ms或者200ms都是可以的(不同情况下会不一样),但如果设置成50ms就不太合理。 暂停时间设置的太短,就会导致出现G1跟不上垃圾产生的速度。终退化成Full GC。所以对这个参数的调优是 一个持续的过程,逐步调整到佳状态。暂停时间只是一个目标,并不能总是得到满足。
3. 使用-XX:ConcGCThreads=n来增加标记线程的数量
IHOP如果阀值设置过高,可能会遇到转移失败的风险,比如对象进行转移时空间不足。如果阀值设置过低,就会 使标记周期运行过于频繁,并且有可能混合收集期回收不到空间。 IHOP值如果设置合理,但是在并发周期时间过长时,可以尝试增加并发线程数,调高ConcGCThreads。
4. MixedGC调优
-XX:InitiatingHeapOccupancyPercent
-XX:G1MixedGCLiveThresholdPercent
-XX:G1MixedGCCountTarger
-XX:G1OldCSetRegionThresholdPercent