1. 程式人生 > >三.GC相關之三分鐘認識GC算法

三.GC相關之三分鐘認識GC算法

才會 src image fin 問題 png 參數調整 當前 子類

GC算法慢慢演化,進化到了現在的分代GC。其進化過程 標記-清除算法 –> 標記-復制算法 –> 標記-整理算法 –> 分代算法。

在介紹算法之前,我們知道Java是動態加載。其特點:

1.具有層級關系,由Bootstrap class loader –> Extension class loader -> System class loader (App Class Loader)-> User Defined Class Loader。

2.委派加載方式,加載一個類時,先看父類是否已經加載,只有父類無法加載,子類才會嘗試加載,這確保了應用程序加載的是同一個類(同一份代碼)。

3.使類具有使用限制,父類無法訪問子類加載的類,而子類可以使用父類加載的類。

4.雖然加載類不能卸載其加載的類,但可以刪除當前加載類。

如圖:

技術分享

通過Java的動態加載機制我們可以知道,java的一個live對象,可以從根(最頂端的加載類)處追查到。了解了這個我們再來具體的GC算法。

標記-清除算法:

技術分享

通過將可以追溯到的對象打標記,然後將沒有標記的對象刪除。這種算法的缺點是會造成內存碎片。

標記-復制算法:

技術分享

將內存一分為二,將未標記的對象刪除,然後將標記的對象復制到另一塊。這種算法雖然避免了內存碎片問題,但卻帶來了內存浪費的問題(有一半內存時空的)。

標記-整理算法:

技術分享

這種算法將未標記的對象刪除,然後將標記的對象進行內存整理。這種算法雖避免了前兩種算法的缺陷,但卻帶來了效率低下的問題。

分代算法:

技術分享

這種算法可根據應用程序的需要進行算法選擇及參數調整,下節我們再具體聊下GC的參數調整。

三.GC相關之三分鐘認識GC算法