效能優化|講的最清楚的垃圾回收演算法

樂哉開講發表於2020-11-02

效能優化|垃圾回收演算法

標記-清除演算法

標記-清除分為標記和清除兩個階段,在標記階段jvm會在需要回收的物件上面打上標記,標記階段完成後,jvm開始執行清除動作,這個階段會清除掉那些被標記的需要回收的物件。
記憶體整理前後對比:
黑色是存活物件,灰色是垃圾物件
在這裡插入圖片描述
在這裡插入圖片描述

結論:使用標記-清除演算法,清理垃圾後會發現存活物件分佈的位置比較零散,如果有有大物件需要分配的話,很難有連續的空間進行分配;
缺點:效率低、空間碎片

複製演算法

為了解決記憶體碎片問題,jvm大師們研究出了複製演算法,複製演算法的原理是將記憶體空間分為兩塊,當其中一塊記憶體使用完之後,就會將存活物件複製到另外一塊記憶體上,將之前的記憶體塊直接清理掉,這樣就不會產生記憶體碎片的問題了。
使用複製演算法,記憶體前後對比
在這裡插入圖片描述
在這裡插入圖片描述

結論:解決了記憶體碎片的問題,但是會導致記憶體空間縮減一半,適用於存活物件少的區域。

標記整理演算法

標記整理演算法的步驟和標記-清除是一樣的,不過最後多加一步就是整理,用來整理存活物件造成的記憶體碎片,使用標記-整理後記憶體前後對比:

在這裡插入圖片描述
在這裡插入圖片描述

結論:可以看出,執行標記-整理 之後,沒有出現記憶體碎片,所有存活物件被移到了一邊。

分代收集演算法

分代收集演算法主要就是將記憶體分為兩個年代,一個是年輕代,一個是老年代,在年輕代中使用複製演算法,因為年輕代存活的物件少,比較適合使用複製演算法,老年代使用標記整理演算法,因為老年代垃圾比較少,所以適用於標記整理演算法

微信搜一搜【樂哉開講】關注帥氣的我,回覆【乾貨領取】,將會有大量面試資料和架構師必看書籍等你挑選,包括java基礎、java併發、微服務、中介軟體等更多資料等你來取哦。

相關文章