一.GC定義與做用算法
GC就是垃圾回收機制的簡寫 GC能夠找到內存中的垃圾,並釋放和回收空間,GC裏的垃圾是什麼 以下圖所示:數組
GC算法是什麼:GC是一種機制,垃圾回收器完成具體的工做 工做的內容就是查找垃圾釋放空間,回收空間算法就是工做時查找和回收函數
所遵循的規則。常見GC算法有引用計數,標記清除,標記整理,分代回收。3d
二.GC算法的工做原理及優缺點對象
1.引用計數算法實現原理blog
核心思想:設置引用數,判斷當前引用數是否爲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.標記整理算法的實現原理
標記整理能夠看作標記清除的一個加強操做,標記階段的操做與標記清除一致,第二個階段在標記清除階段會先執行整理,移動對
象位置,這樣能夠避免分散的地址的不連續的小空間,以下圖所示: