<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go垃圾回收、三色標記原理,終于能跟面試官扯皮了!

          共 2142字,需瀏覽 5分鐘

           ·

          2021-09-18 17:19

          垃圾回收(Garbage Collection,簡稱 GC)是編程語言中自動的內(nèi)存管理機制,垃圾指的是不再需要的內(nèi)存塊,如果不及時清理就沒有辦法再利用。如果不回收會占用越來越多的內(nèi)存內(nèi)存

          垃圾回收算法

          常見的垃圾回收算法有:

          引用計數(shù):每個對象維護一個引用計數(shù),如果這個對象被銷毀,則計數(shù) -1 ,當計數(shù)為 0 時,回收該對象。

          • 優(yōu)點:對象可以很快被回收,不會出現(xiàn)內(nèi)存耗盡或到達閥值才回收。
          • 缺點:不能很好的處理循環(huán)引用

          標記-清除:從根變量開始遍歷所有引用的對象,引用的對象標記“被引用”,沒有被標記的則進行回收。

          • 優(yōu)點:解決了引用計數(shù)的缺點。
          • 缺點:需要 STWstop the world),暫時停止程序運行。

          分代收集:按照對象生命周期長短劃分不同的代空間,生命周期長的放入老年代,短的放入新生代,不同代有不同的回收算法和回收頻率。

          • 優(yōu)點:回收性能好
          • 缺點:算法復(fù)雜

          Go 語言的 GC(垃圾回收)怎么做的呢!我們來版本討論

          標記-清除(mark and sweep)

          此算法是在 Go V1.3 之前使用的,主要有兩個主要的步驟:標記(Mark phase)—>清除(Sweep phase)。

          1、暫停程序業(yè)務(wù)邏輯, 找出不可達的對象,然后做上標記。

          注意:mark and sweep 算法在執(zhí)行的時候,需要程序暫停!也就是所謂的 STW(stop the world)。這段時間程序會卡住,一會細講。

          程序可達對象為 1、2、4

          2、開始標記,找出所有可達的對象,并標記

          對象 1、24 做上標記

          3、清除未被標記的對象

          4、程序暫停取消。然后重復(fù)上面的過程,直至程序生命周期結(jié)束。

          三色并發(fā)標記法

          此算法是在Go V1.5 開始使用的,三色只是為了敘述上方便抽象出來的一種說法,實際上對象并沒有顏色之分。這里的三色,對應(yīng)了垃圾回收過程中對象的三種狀態(tài):

          • 灰色:對象還在標記隊列中等待
          • 黑色:對象已被標記,該對象不會在本次 GC 中被清理
          • 白色:對象未被標記,該對象將會在本次 GC 中被清理

          步驟一、初始狀態(tài)下所有對象都是白色的。

          步驟二、從根節(jié)點開始遍歷所有對象,把遍歷到的對象變成灰色對象(備注:這里變成灰色對象的都是根節(jié)點的對象)。

          步驟三、遍歷灰色對象,將灰色對象引用的對象 (備注:這里指的是灰色對象引用到的所有對象,包括灰色節(jié)點間接引用的那些對象) 也變成灰色對象,然后將遍歷過的灰色對象變成黑色對象。

          步驟四、循環(huán)步驟三,直到灰色對象全部變黑色

          步驟五、通過寫屏障(write-barrier)檢測對象變化,重復(fù)以上操作(備注:因為 mark 和用戶程序是并行的,所以在上一步執(zhí)行的時候可能會有新的對象分配,寫屏障是為了解決這個問題引入的)。

          步驟六、收集所有白色對象(垃圾)。

          最后、上面的垃圾回收結(jié)束之后,GC 會在進行一步操作,也就是將黑色對象重新變色成白色對象,供下一次垃圾回收使用。

          Stop The World

          剛剛提到了GC過程中會停止程序運行,這種行為叫 STWStop The World)在Go中是停掉所有的 goroutine,專心做垃圾回收,待垃圾回收結(jié)束后再恢復(fù) goroutine。

          STW 時間的長短直接影響了應(yīng)用的執(zhí)行,時間過長對于一些 web 應(yīng)用來說是不可接受的,這也是廣受詬病的原因之一。

          為了縮短 STW 的時間,Golang 不斷優(yōu)化垃圾回收算法,這種情況得到了很大的改善。

          垃圾回收優(yōu)化

          寫屏障(Write Barrier)

          STW 目的是防止 GC 掃描時內(nèi)存變化而停掉 goroutine,而寫屏障就是讓 goroutineGC 同時運行的手段。雖然寫屏障不能完全消除 STW,但是可以大大減少 STW 的時間。

          寫屏障類似一種開關(guān),在 GC 的特定時機開啟,開啟后指針傳遞時會把指針標記,即本輪不回收,下次 GC 時再確定。

          GC 過程中新分配的內(nèi)存會被立即標記,用的并不是寫屏障技術(shù),也即 GC 過程中分配的內(nèi)存不會在本輪 GC 中回收。

          輔助 GC(Mutator Assist)

          為了防止內(nèi)存分配過快,在 GC 執(zhí)行過程中,如果 goroutine 需要分配內(nèi)存,那么這個 goroutine 會參與一部分 GC 的工作,即幫助 GC 做一部分工作,這個機制叫作 Mutator Assist。

          垃圾回收觸發(fā)時機

          1、每次內(nèi)存分配時都會檢查當前內(nèi)存分配量是否已達到閥值,如果達到閥值則立即啟動 GC。內(nèi)存增長率由環(huán)境變量 GOGC 控制,默認為 100,即每當內(nèi)存擴大一倍時啟動 GC。
          閥值 = 上次GC內(nèi)存分配量 * 內(nèi)存增長率

          2、默認情況下,最長 2 分鐘觸發(fā)一次 GC。

          3、程序代碼中也可以使用如下命令來手動觸發(fā) GC。主要用于 GC 性能測試和統(tǒng)計。

          runtime.GC()

           有什么問題,可以公眾號內(nèi)回復(fù)或加我微信交流。

          NEW////ARRIVAL

          微信公眾號

          gophpython

          我的微信

          wucs_dd

          瀏覽 67
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  自拍亚洲婷婷 | 欧美日韩成人电影 | 欧美干| 自拍偷拍一 | 日韩操逼电影 |