當前位置:編程學習大全網 - 源碼下載 - Golang的垃圾回收

Golang的垃圾回收

最近垃圾分類的話題熱度壹下子就上去了,很多人因為垃圾分類的問題很頭痛。因為垃圾這個話題,那我就想來說說Golang裏面的垃圾,於是就有了這篇博客,golang中的垃圾回收。

現階段網上針對golang垃圾回收的解析已經很多了,所以我也沒有必要仔仔細細的壹點點說,還是那個原則,用最直白的話告訴妳,垃圾到底是怎麽收的。

首先本文後續都會使用 GC 代替垃圾回收這幾個字。

我們知道創建對象會給他分配內存資源,如果這個對象不使用了,而這個內存資源卻壹直被占用的話,那麽我們的電腦很快就會被放滿,所以需要將這些垃圾對象進行回收。

要回收,那麽我們必須知道什麽才是垃圾,什麽不是垃圾。

在我們看來,壹個對象以後都不用了,就是垃圾。

在程序看來,壹個對象沒有被引用了,就是垃圾。

首先說明壹下,下面說的停,都是STW,stop the world,全世界暫停,所有運行的都停下來了。

先告訴所有人,停壹下,我來記錄壹下當前狀態。

告訴所有人,妳們繼續,該幹嘛幹嘛,我標記壹下要用的對象

壹開始所有點是白色,首先從根節點出發,標記相連的點為灰色(相連證明有引用),並且將所有灰色的點存起來;

告訴所有人,再停壹下,在第二個過程中,因為所有人繼續在工作,那麽就會產生新的垃圾,因為第壹個過程記錄了狀態,所以需要標記壹下新的垃圾;然後清除所有白色的點,因為白色的點是沒人引用的,也就是垃圾。

妳壹定會有這樣的疑問:

那麽既然會導致那麽多問題,為什麽不直接停下來,標記完回收完了再開始呢?

因為慢~

所以這樣GC的原因是既要保證GC正常執行,又要保證效率,不能停的時間太長。

其實第壹次停的時候,啟動了壹個寫屏障 (write barrier)它需要記錄後續過程中新創建的對象

這個過程稱為三色標記,有點類似廣度優先搜索。

這次是必須停,因為在第二個過程中引用會發生變化,從而需要停止後重新掃描壹遍;然後關閉寫屏障,最後再清理。

開啟寫屏障時需要stw

關閉寫屏障前需要stw

開啟寫屏障之後的標記過程與其他程序並發執行

關閉寫屏障之後的清掃過程與其他程序並發執行

那畢竟GC還是需要STW的,雖然可能停止時間很短,但是對於程序來說,整個程序停止1秒那對於用戶來說就是致命打擊。所以GC肯定需要壹個觸發的條件,不能想來就來。

這是壹個觸發的條件,默認GC百分比設置的是100,意思是,如果這次回收之後總***占用2M的內存,那麽下次觸發的條件時當超過4M的時候;同理,當這次回收之後總***占用4M,那麽下次觸發條件就是8M。

這個簡單,當壹定時間(2分鐘)沒有執行過GC就觸發GC

使用命令 runtime.GC() 手動觸發GC

以上就是在golang中垃圾回收的大致流程,總的來說使用三色標記法進行標記清除,並且標記時與程序運行並行,為了解決問題使用寫屏障來記錄標記過程中對象的變更。總來的來說也是為了提高垃圾回收的效率,並且盡可能的減少STW的時間。

了解下來,與java的分代回收相比,golang中的回收算法理解起來更加簡單壹些。

/articles/21569

/2014/09/03/visualizing-garbage-collection-algorithms/

/p/8b0c0f7772da

/2017/04/28/golang-gc/

  • 上一篇:什麽是IIs?
  • 下一篇:我忘記了管理員超級帳戶的密碼,這是機器上唯壹的帳戶。我怎樣才能登錄?
  • copyright 2024編程學習大全網