JVM性能調優-剖析標記整理演算法與分代收集演算法
- 2019 年 12 月 20 日
- 筆記
標記整理演算法解決了什麼問題
複製收集演算法在對象存活率較⾼時就要進⾏較多的複製操作,效率將會變低。更關鍵的是,如果不想浪費 50%的空間,就需要有額外的空間進⾏分配擔保,以應對被使⽤的記憶體中所有對象都 100%存活的極端情況,所以在⽼年代⼀般不能直接選⽤這種演算法
標記-整理
根據⽼年代的特點,有⼈提出了另外⼀種「標記-整理(Mark- Compact)演算法,標記過程仍然與「標記-清除」演算法⼀樣,但後續步驟不是直接對可回收對象進⾏清理,⽽是讓所有存活的對象都向⼀端移動,然後直接清理掉端邊界以外的記憶體
分代收集
⼀般把 Java 堆分為新⽣代和⽼年代,這樣就可以根據各個年代的特點采⽤最適當的收集演算法.在新⽣代中,每次垃圾收集時都發現有⼤批對象死去,只有少量存活,那就選⽤複製演算法,只需要付出少量存活對象的複製成本就可以完成收集。⽽⽼年代中因為對象存活率⾼、沒有額外空間對它進⾏分配擔保,就必須使⽤「標記-清理」或者「標記⼀整理」演算法來進⾏回收