日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

根可达算法的根_GC垃圾回收算法

發布時間:2025/3/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 根可达算法的根_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垃圾回收算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。