什么时候会发生垃圾回收
- MinorGC:Eden区或者S区不够用了
- MajorGC:老年代不够用了
- FullGC = MinorGC + MajorGC + MetaSpace GC
- System.gc()(该方法不会立即唤起gc )
什么时候需要调优
- 出现问题:频繁GC?cpu高--->打印GC日志--->结合工具查看---> 修改堆内存空间/垃圾收集器选择
- cpu持续飙升:top查看哪个进程cpu使用率高--->查看可能的情况情况:线程/堆栈/jvm参数 jstack/jinfo/jmap--->
- oom:dump文件,分析dump文件--->MAT/其他工具
如何调优
1、调整堆大小(调大):Xms、Xmx
- 提高吞吐量
- GC次数减少
- 停顿时间变大(空间变大了,打扫时间变长)
2、设置停顿时间(G1)(调小):-XX:MaxGCPauseMillis=15
- 停顿时间变小
- GC次数变多
- 吞吐量无太大变化
切记不要手动调整young区大小,设置停顿时间的时候会自适应地调整young区的大小。
3、启动并发GC时(堆内存使用占比)调
G1和CMS的区别
- CMS:标记-清除 空间碎片;G1:标记-整理 减少空间碎片
- CMS:分新生代老年代。引用Card Table;G1:分region,物理上不分young和old区,只有逻辑上区分。Remerbered Set RSet,谁引用了我
- G1:多核、大内存,G1停顿时间。