根可达算法的根_GC垃圾回收算法
GC定義
「GC」是Garbage Collection的縮寫,即回收垃圾,那么「垃圾」指的是什么呢?
當然這里指的不是現實世界的垃圾,在程序世界中垃圾定義為
?
程序不用的內存空間視為垃圾
?
「GC」需要做的是
?找到內存里面的垃圾回收垃圾,讓內存空間再利用?
指針
在GC 算法中,指針是不可或缺的。我們用星號(*)訪問指針所引用的內存空間。例如:我們把指針「ptr」 指向的對象表示為 *「ptr」。
對象,頭,域
對象和指針
對象和指針
mutator
mutator 是Edsger Dijkstra琢磨出來的詞,有“改變某物”的意思。說到要改變什么,那就是GC 對象間的引用關系。
mutator 實際進行的操作有以下2 種。
- 生成對象
- 更新指針
堆
堆
活動對象與非活動對象
活動對象與非活動對象
最大暫停時間
因執行「GC」 而暫停執行mutator 的最長時間。如下圖,最大暫停時間是A~C 的最大值,也就是B。
GC執行圖
如上圖:假設GC對象的對大小為HEAP_SIZE。在大小為HEAP_SIZE的堆進行內存管理,要花費的時長為(++)。因此,這種情況下GC 的吞吐量為HEAP_SIZE /(A + B + C)。
GC性能評價標準
- 吞吐量
- 最大暫停時間(需要縮短最大暫停時間)
- 堆使用效率(可用的堆越大,GC 運行越快)
- 訪問的局部性
什么是訪問的局部性
另一方面,具有「引用關系的對象之間通常很可能存在連續訪問」的情況。這在多數程序中都很常見,稱為“訪問的局部性”。考慮到訪問的局部性,把具有引用關系的對象安排在堆中較近的位置,就能提高在緩存中讀取到想利用的數據的概率,令mutator高速運行。
垃圾回收算法
GC標記-清除算法
GC 標記- 清除算法由標記階段和清除階段構成。標記階段是把所有活動對象都做上標記的階段。清除階段是把那些沒有標記的對象,也就是非活動對象回收的階段。通過這兩個階段,就可以令不能利用的內存空間重新得到利用。
標記階段
執行GC前堆的狀態
標記階段結束后堆的狀態
?
搜索對象進行標記是采用的算法:深度優先搜索,,深度優先搜索比廣度優先搜索更能壓低內存使用量。因此我們在標記階段經常用到深度優先搜索。
?
深度優先搜索
深度優先搜索是縱向搜索,如上圖的搜索順序。
清除階段
清除階段結束后堆的狀態
分配
將回收的垃圾進行再利用,需要分配。在清除階段,我們把垃圾對象連接到空閑的鏈表,搜索空閑鏈表并尋找 大小合適的分塊,這項操作就叫作分配。
合并
根據分配策略的不同可能會產生大量的小分塊。但如果它們是連續的,我們就能把所有的小分塊連在一起形成一個大分塊。這種“連接連續分塊”的操作就叫作合并(coalescing),合并是在清除階段進行的。
位圖標記
只收集各個對象的標志位并表格化,不跟對象一起管理。在標記的時候,不在對象的頭里置位,而是在這個表格中的特定場所置位。像這樣集合了用于標記的位的表格稱為“位圖表格”(bitmap table),利用這個表格進行標記的行為稱為“位圖標記”。位圖表格的實現方法有多種,例如散列表和樹形結構和整數型數組等。
位圖標記
延遲清除法
清除操作所花費的時間是與堆大小成正比的,如果處理的堆越大,清除算法所花費的時間就越長。
延遲清除法,在標記操作結束后,不一定會進行清除操作,會縮減mutator的暫停時間。
標記清除算法的優缺點
?
優點:標記清除算法實現簡單,與其他的的算法組合也就相對簡單;
缺點:標記清楚算法不會移動對象,但容易產生碎片化的空間,造成內存浪費。
?
如圖:
上圖的「根」指的是「GC root」,通過「根可達算法」確認是不是垃圾。這里簡單介紹下根可達算法的定義:
從GC Root作為起點開始搜索,那么整個連通圖中對象都是活的,對于GC Root無法達到的對象便是垃圾對象,隨時可被GC回收。如果我需要3空間的內存,而2空間的內存就存不下。就會被空閑,造成內存浪費。
引用計數法
引用計數法中引入了一個計數器。計數器表示的是對象的引用次數。如果對象引用次數為0,那么這個對象可以被清除。
優缺點
「優點」:可即刻回收垃圾,空間不會被垃圾長久占用。
「缺點」:計數器值的增減處理繁重,計數器也需要占用內存。無法回收循環引用。
GC復制算法
簡單來說,GC復制算法就是把空間里的活動對象復制到其他空間。把原空間里的所有對象都回收掉。如圖所示:
當From空間被占滿時,GC將活動的對象全部復制到To空間。當復制完成后,該算法會將From空間和To空間互換,GC結束。。From 空間和To 空間大小必須一致。這是為了保證能把From 空間中的所有活動對象都收納到To 空間里。
優缺點
優秀的吞吐量,可實現高速分配,不會發生碎片化。
但是復制算法需要把堆進行二等分,只有一半的堆能被使用。造成堆的浪費。還有復制算法在復制某個對象時要遞歸復制它的對象,這里會帶來額外的負擔,有棧溢出的可能。
GC標記壓縮算法
此算法分為標記階段和壓縮階段,標記階段同上面幾種算法的標記功能一樣,我們來說說壓縮階段,分為3步驟:
?設定forwarding 指針更新指針移動對象?
標記壓縮實際上就是將活動的對象xi整理到一邊,盡量的減少碎片化,來看看實際的效果:
image-20200730141439426
優缺點
可有效利用堆,但是壓縮會有計算成本。
GC主要的回收算法就介紹這么多了,其實際的算法很復雜。有興趣的可以自行研究。
「參考:」
《垃圾回收的算法與實現》 作者: 中村成洋 / 相川光
總結
以上是生活随笔為你收集整理的根可达算法的根_GC垃圾回收算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: less 函数_Python中的函数式编
- 下一篇: gsea富集分析结果怎么看_怎么看肝功能