一.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.標記整理算法的實現原理
標記整理可以看做標記清除的一個增強操作,標記階段的操作與標記清除一致,第二個階段在標記清除階段會先執行整理,移動對
象位置,這樣可以避免分散的地址的不連續的小空間,如下圖所示:


