1. 掌握不同的GC算法之間區(qū)別與各自適用場景
- Serial: 單線程, 無論Young GC 還是 Full GC 均會(huì)造成卡頓(stop-the-world)絮短,適用于CPU資源嚴(yán)重受限的情況
- Throughput: 又稱Parallel GC, 是Serial的多線程并行版萎庭,在stop-the-world期間使用多個(gè)線程執(zhí)行GC.
- CMS: Concurrent GC(并發(fā)型GC) 即在對Old Gen/PermGen 進(jìn)行GC時(shí)刘离,不會(huì)暫停應(yīng)用線程(應(yīng)用線程與GC線程同時(shí)運(yùn)行垢揩,即一邊扔垃圾一邊收拾房間)因谎,然而Young GC時(shí)仍然會(huì)暫停應(yīng)用線程闹获。與Parallel相比優(yōu)點(diǎn)是吞吐量更大期犬,然而Old Gen GC時(shí)會(huì)消耗更多CPU資源。與G1相比昌罩,適用于堆相對較小的場景哭懈。
- G1: 與CMS同為Concurrent GC, 以metaspace的概念取代PermGen, GC時(shí)采用的Region(分區(qū))的方式,與CMS相比適用于堆較大的情況(4G以上)茎用。
2. 獲悉JVM實(shí)時(shí)狀態(tài)及GC操作日志
- jstat, jconsole等JDK自帶工具
- Java Flight Record 等商用工具
- 工具的可選項(xiàng)
3. JVM調(diào)優(yōu)的核心目標(biāo)
更高的吞吐量遣总,即應(yīng)用線程運(yùn)行時(shí)間占總運(yùn)行時(shí)間的百分比最高:
吞吐量 = 應(yīng)用線程運(yùn)行時(shí)間 / (應(yīng)用線程運(yùn)行時(shí)間 + GC線程運(yùn)行時(shí)間)
4. JVM調(diào)優(yōu)時(shí)需要考慮的點(diǎn)
- Heap size的平衡
- Heap size較小,優(yōu)點(diǎn):Full GC的平均時(shí)長較短轨功;缺點(diǎn):Young GC會(huì)非常頻繁旭斥;
- Heap size較大,優(yōu)點(diǎn):GC的頻率減少古涧;缺點(diǎn):延長Full GC執(zhí)行的時(shí)間垂券;
- Heap size的自適應(yīng)調(diào)整機(jī)制
- GC線程的數(shù)量
- 配置線程數(shù)量的參考公式