在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多
1.MinorGC 和Full GC
MinorGC 执行时间不到50ms; Minor GC 执行不频繁,约10秒一次; Full GC 执行时间不到1s; Full GC
执行频率不算频繁,不低于10分钟1次。
Minor GC触发条件:当Eden区满时,触发Minor GC。
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)元空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
(6)堆外缓冲区不足
2.fullGC之后,系统稳定情况下
老年代空间占用是老年代空间的活跃数据。其他堆空间的分配,基于以下规则来进行,如果发生大量大对象new
的话,比如计算或者分析,需要找到系统的阈值,不建议使用以下参数
空间 | 执行命令 | 建议扩大倍数 |
---|---|---|
堆 | -Xms -Xmx | 3-4倍 full Gc 后的老年代空间占用 |
新生代 | -XX:NewSize-XX:MaxNewSize | 1-1.5倍 full Gc 后的老年代空间占用 |
老年代 | 2-3倍 full Gc 后的老年代空间占用 | |
元空间 | -XX:MaxMetaspaceSize | 1.2-1.5倍 full Gc 后的老年代空间占用 |
-XX:NewRatio=3
新生代:老年代比例=1:3,新生代占整个堆的1/4
可以不用设置-XX:NewSize-XX:MaxNewSize
-XX:SurvivorRatio=8
新生代中新生代 Eden区、ServivorFrom、ServivorTo三个区比例8:1:1
-XX:PretenureSizeThreshold=10M
大对象直接在老年代分配阈值
-XX:MaxDirectMemorySize=128m
堆外缓冲区大小
3.开启GC日志
一般以下即可