GC演算法介紹及工作原理和優缺點

メSerendipity發表於2021-01-16

一.GC定義與作用

GC就是垃圾回收機制的簡寫 GC可以找到記憶體中的垃圾,並釋放和回收空間,GC裡的垃圾是什麼 如下圖所示:

GC演算法是什麼:GC是一種機制,垃圾回收器完成具體的工作 工作的內容就是查詢垃圾釋放空間,回收空間演算法就是工作時查詢和回收

所遵循的規則。常見GC演算法有引用計數,標記清除,標記整理,分代回收。

二.GC演算法的工作原理及優缺點

1.引用計數演算法實現原理

核心思想:設定引用數,判斷當前引用數是否為0 引用關係改變時修改引用數字,比如有一個物件指向它 他的引用計數+1 多個物件

引用,引用計數累加引用計數累加,當沒有物件引用時引用計數為0 GC立即進行回收,下面通過程式碼來分析下工作原理:

上述程式碼中,從全域性角度出發,user1,user2及meauList 計數都不為0 ,num1和num2,當函式fn()執行完成後全域性作用訪問不到num1

和num2,所以說num1和num2計數為0,會被GC回收。當所有的程式碼執行完成後,user1和user2也不為0,因為被meauList陣列中引

用,所以計數+1

2.引用計數演算法的優缺點

優點:

最大限度的減少程式暫停,記憶體有一定的上限,當記憶體即將爆滿時,引用計數會立馬找到數值為0的計數空間對其進行釋放,這樣就保

證了記憶體不會有暫滿的時候。

缺點:

1.時刻監聽著引用數值是否需要修改,時間開銷比較大

2.無法回收迴圈引用的物件 具體用程式碼實現如下圖所示:

如上圖所示:當fn執行完成後,obj1和obj2都是區域性變數,按說是要被回收的,但是後面obj1.name=obj2,obj2.name=obj1有著互相被

引用的關係,所以說數值並不為0,就沒有辦法對這兩個空間進行回收了,從而造成了記憶體空間的浪費,這也就是物件之間的迴圈引

用。

3.標記清除演算法實現原理

核心思想:分標記和清除 二個階段完成,

第一個階段 遍歷所有物件找標記活動物件(可達物件)。

第二個階段 把那些沒有被標記的物件進行清除 同時也會抹掉第一個階段的標記 便於我們GC下次正常的工作把回收的空間放到一個

空閒列表的上面,方便我們的程式後續直接在這裡申請空間。

用圖示方式進行舉例說明:

如上圖所示A B C為全域性變數,D E被A和C引用 所以ABCDE都是可達物件 第一步會被標記上,第二階段 查詢沒有被標記的物件 如上

圖中的a1和b1為未標記的,全域性作用域內查詢不到,則會被GC清除掉。

4.標記清除演算法的優缺點

優點:

可以回收迴圈引用的物件,如上圖所示,比如a1和b1為函式內部的區域性變數,就失去了與全域性global的連線,不可達的物件在標記階段就

不可標記,在第二個階段會被清除,而在引用計數演算法中有引用的關係 所以計數不為0 所以不能被清除

缺點:

如下圖所示,我們從根去查詢 紅色區域為一個可達物件,左右兩側分別為兩個不可達的物件,在第二輪的清除操作中會被清除掉,再

把剩餘空間新增到空閒列表之上,這就有一個問題了,比如最左側的是B物件,中間的可達物件為A物件,最右側的為C物件,BC物件

儲存語言資訊,比如大小和地址,我們稱之為頭。還有一個我們存放資料的稱之為域,看上去是釋放了3個域的大小,但是中間間隔著

A物件,其實他們還是分散的,也就是地址不連續,如果說操那個申請列表申請1.5個域大小的空間,左側超出了浪費,右側直接就不夠

,稱之為空間的碎片化。

5.標記整理演算法的實現原理

標記整理可以看做標記清除的一個增強操作,標記階段的操作與標記清除一致,第二個階段在標記清除階段會先執行整理,移動對

象位置,這樣可以避免分散的地址的不連續的小空間,如下圖所示:

相關文章