1. 掌握不同的GC算法之间区别与各自适用场景
- Serial: 单线程, 无论Young GC 还是 Full GC 均会造成卡顿(stop-the-world),适用于CPU资源严重受限的情况
- Throughput: 又称Parallel GC, 是Serial的多线程并行版,在stop-the-world期间使用多个线程执行GC.
- CMS: Concurrent GC(并发型GC) 即在对Old Gen/PermGen 进行GC时,不会暂停应用线程(应用线程与GC线程同时运行,即一边扔垃圾一边收拾房间),然而Young GC时仍然会暂停应用线程。与Parallel相比优点是吞吐量更大,然而Old Gen GC时会消耗更多CPU资源。与G1相比,适用于堆相对较小的场景。
- G1: 与CMS同为Concurrent GC, 以metaspace的概念取代PermGen, GC时采用的Region(分区)的方式,与CMS相比适用于堆较大的情况(4G以上)。
2. 获悉JVM实时状态及GC操作日志
- jstat, jconsole等JDK自带工具
- Java Flight Record 等商用工具
- 工具的可选项
3. JVM调优的核心目标
更高的吞吐量,即应用线程运行时间占总运行时间的百分比最高:
吞吐量 = 应用线程运行时间 / (应用线程运行时间 + GC线程运行时间)
4. JVM调优时需要考虑的点
- Heap size的平衡
- Heap size较小,优点:Full GC的平均时长较短;缺点:Young GC会非常频繁;
- Heap size较大,优点:GC的频率减少;缺点:延长Full GC执行的时间;
- Heap size的自适应调整机制
- GC线程的数量
- 配置线程数量的参考公式