精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 什么時候會觸發 GC?

開發 后端
Go 語言作為一門新語言,在早期經常遭到唾棄的就是在垃圾回收(下稱:GC)機制中 STW(Stop-The-World)的時間過長。

[[426528]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚 。轉載本文請聯系腦子進煎魚了公眾號。

大家好,我是煎魚。

Go 語言作為一門新語言,在早期經常遭到唾棄的就是在垃圾回收(下稱:GC)機制中 STW(Stop-The-World)的時間過長。

那么這個時候,我們又會好奇一點,作為 STW 的起始,Go 語言中什么時候才會觸發 GC 呢?

今天就由煎魚帶大家一起來學習研討一輪。

什么是 GC

在計算機科學中,垃圾回收(GC)是一種自動管理內存的機制,垃圾回收器會去嘗試回收程序不再使用的對象及其占用的內存。

最早 John McCarthy 在 1959 年左右發明了垃圾回收,以簡化 Lisp 中的手動內存管理的機制(來自 @wikipedia)。

為什么要 GC

手動管理內存挺麻煩,管錯或者管漏內存也很糟糕,將會直接導致程序不穩定(持續泄露)甚至直接崩潰。

GC 觸發場景

GC 觸發的場景主要分為兩大類,分別是:

  • 系統觸發:運行時自行根據內置的條件,檢查、發現到,則進行 GC 處理,維護整個應用程序的可用性。
  • 手動觸發:開發者在業務代碼中自行調用 runtime.GC 方法來觸發 GC 行為。

系統觸發

在系統觸發的場景中,Go 源碼的 src/runtime/mgc.go 文件,明確標識了 GC 系統觸發的三種場景,分別如下:

  1. const ( 
  2.  gcTriggerHeap gcTriggerKind = iota 
  3.  gcTriggerTime 
  4.  gcTriggerCycle 
  • gcTriggerHeap:當所分配的堆大小達到閾值(由控制器計算的觸發堆的大小)時,將會觸發。
  • gcTriggerTime:當距離上一個 GC 周期的時間超過一定時間時,將會觸發。-時間周期以 runtime.forcegcperiod 變量為準,默認 2 分鐘。
  • gcTriggerCycle:如果沒有開啟 GC,則啟動 GC。

在手動觸發的 runtime.GC 方法中涉及。

手動觸發

在手動觸發的場景下,Go 語言中僅有 runtime.GC 方法可以觸發,也就沒什么額外的分類的。

但我們要思考的是,一般我們在什么業務場景中,要涉及到手動干涉 GC,強制觸發他呢?

需要手動強制觸發的場景極其少見,可能會是在某些業務方法執行完后,因其占用了過多的內存,需要人為釋放。又或是 debug 程序所需。

基本流程

在了解到 Go 語言會觸發 GC 的場景后,我們進一步看看觸發 GC 的流程代碼是怎么樣的,我們可以借助手動觸發的 runtime.GC 方法來作為突破口。

核心代碼如下:

  1. func GC() { 
  2.  n := atomic.Load(&work.cycles) 
  3.  gcWaitOnMark(n) 
  4.  
  5.  gcStart(gcTrigger{kind: gcTriggerCycle, n: n + 1}) 
  6.    
  7.  gcWaitOnMark(n + 1) 
  8.  
  9.  for atomic.Load(&work.cycles) == n+1 && sweepone() != ^uintptr(0) { 
  10.   sweep.nbgsweep++ 
  11.   Gosched() 
  12.  } 
  13.    
  14.  for atomic.Load(&work.cycles) == n+1 && atomic.Load(&mheap_.sweepers) != 0 { 
  15.   Gosched() 
  16.  } 
  17.    
  18.  mp := acquirem() 
  19.  cycle := atomic.Load(&work.cycles) 
  20.  if cycle == n+1 || (gcphase == _GCmark && cycle == n+2) { 
  21.   mProf_PostSweep() 
  22.  } 
  23.  releasem(mp) 

在開始新的一輪 GC 周期前,需要調用 gcWaitOnMark 方法上一輪 GC 的標記結束(含掃描終止、標記、或標記終止等)。

開始新的一輪 GC 周期,調用 gcStart 方法觸發 GC 行為,開始掃描標記階段。

需要調用 gcWaitOnMark 方法等待,直到當前 GC 周期的掃描、標記、標記終止完成。

需要調用 sweepone 方法,掃描未掃除的堆跨度,并持續掃除,保證清理完成。在等待掃除完畢前的阻塞時間,會調用 Gosched 讓出。

在本輪 GC 已經基本完成后,會調用 mProf_PostSweep 方法。以此記錄最后一次標記終止時的堆配置文件快照。

結束,釋放 M。

在哪觸發

看完 GC 的基本流程后,我們有了一個基本的了解。但可能又有小伙伴有疑惑了?

本文的標題是 “GC 什么時候會觸發 GC”,雖然我們前面知道了觸發的時機。但是....Go 是哪里實現的觸發的機制,似乎在流程中完全沒有看到?

監控線程

實質上在 Go 運行時(runtime)初始化時,會啟動一個 goroutine,用于處理 GC 機制的相關事項。

代碼如下:

  1. func init() { 
  2.  go forcegchelper() 
  3.  
  4. func forcegchelper() { 
  5.  forcegc.g = getg() 
  6.  lockInit(&forcegc.lock, lockRankForcegc) 
  7.  for { 
  8.   lock(&forcegc.lock) 
  9.   if forcegc.idle != 0 { 
  10.    throw("forcegc: phase error"
  11.   } 
  12.   atomic.Store(&forcegc.idle, 1) 
  13.   goparkunlock(&forcegc.lock, waitReasonForceGCIdle, traceEvGoBlock, 1) 
  14.     // this goroutine is explicitly resumed by sysmon 
  15.   if debug.gctrace > 0 { 
  16.    println("GC forced"
  17.   } 
  18.  
  19.   gcStart(gcTrigger{kind: gcTriggerTime, now: nanotime()}) 
  20.  } 

在這段程序中,需要特別關注的是在 forcegchelper 方法中,會調用 goparkunlock 方法讓該 goroutine 陷入休眠等待狀態,以減少不必要的資源開銷。

在休眠后,會由 sysmon 這一個系統監控線程來進行監控、喚醒等行為:

  1. func sysmon() { 
  2.  ... 
  3.  for { 
  4.   ... 
  5.   // check if we need to force a GC 
  6.   if t := (gcTrigger{kind: gcTriggerTime, now: now}); t.test() && atomic.Load(&forcegc.idle) != 0 { 
  7.    lock(&forcegc.lock) 
  8.    forcegc.idle = 0 
  9.    var list gList 
  10.    list.push(forcegc.g) 
  11.    injectglist(&list) 
  12.    unlock(&forcegc.lock) 
  13.   } 
  14.   if debug.schedtrace > 0 && lasttrace+int64(debug.schedtrace)*1000000 <= now { 
  15.    lasttrace = now 
  16.    schedtrace(debug.scheddetail > 0) 
  17.   } 
  18.   unlock(&sched.sysmonlock) 
  19.  } 

這段代碼核心的行為就是不斷地在 for 循環中,對 gcTriggerTime 和 now 變量進行比較,判斷是否達到一定的時間(默認為 2 分鐘)。

若達到意味著滿足條件,會將 forcegc.g 放到全局隊列中接受新的一輪調度,再進行對上面 forcegchelper 的喚醒。

堆內存申請

在了解定時觸發的機制后,另外一個場景就是分配的堆空間的時候,那么我們要看的地方就非常明確了。

那就是運行時申請堆內存的 mallocgc 方法。核心代碼如下:

  1. func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer { 
  2.  shouldhelpgc := false 
  3.  ... 
  4.  if size <= maxSmallSize { 
  5.   if noscan && size < maxTinySize { 
  6.    ... 
  7.    // Allocate a new maxTinySize block. 
  8.    span = c.alloc[tinySpanClass] 
  9.    v := nextFreeFast(span) 
  10.    if v == 0 { 
  11.     v, span, shouldhelpgc = c.nextFree(tinySpanClass) 
  12.    } 
  13.    ... 
  14.    spc := makeSpanClass(sizeclass, noscan) 
  15.    span = c.alloc[spc] 
  16.    v := nextFreeFast(span) 
  17.    if v == 0 { 
  18.     v, span, shouldhelpgc = c.nextFree(spc) 
  19.    } 
  20.    ... 
  21.   } 
  22.  } else { 
  23.   shouldhelpgc = true 
  24.   span = c.allocLarge(size, needzero, noscan) 
  25.   ... 
  26.  } 
  27.  
  28.  if shouldhelpgc { 
  29.   if t := (gcTrigger{kind: gcTriggerHeap}); t.test() { 
  30.    gcStart(t) 
  31.   } 
  32.  } 
  33.  
  34.  return x 

小對象:如果申請小對象時,發現當前內存空間不存在空閑跨度時,將會需要調用 nextFree 方法獲取新的可用的對象,可能會觸發 GC 行為。

大對象:如果申請大于 32k 以上的大對象時,可能會觸發 GC 行為。

總結

在這篇文章中,我們介紹了 Go 語言觸發 GC 的兩大類場景,并分別基于大類中的細分場景進行了一一說明。

一般來講,我們對其了解大概就可以了。若小伙伴們對其內部具體實現感興趣,也可以以文章中的代碼具體再打開看。

但需要注意,很有可能 Go 版本一升級,可能又變了,學思想要緊!

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2024-10-29 08:52:01

Go協作式調度

2021-04-19 09:20:01

Go 搶占 P語言

2023-06-06 16:54:00

2015-03-02 14:44:48

AngularJS jQuery超越

2025-02-28 09:04:08

2023-02-01 15:49:51

人工智能AI

2020-05-12 11:25:50

MySQLES數據庫

2017-05-15 09:55:07

2015-07-08 15:55:01

NSStringcopystrong

2012-09-24 10:20:39

JavaScriptJS

2013-11-28 16:03:24

2024-08-05 01:22:16

2022-05-19 10:27:34

機器學習人工智能

2017-06-28 15:06:51

PythonLambda函數

2021-08-13 11:31:23

HTTP

2020-01-05 23:28:51

MQ消息進程

2011-10-18 16:41:23

編程

2021-01-30 19:59:37

性能項目開源

2012-07-26 10:27:31

PHP

2017-04-05 21:43:08

MQ互聯網架構
點贊
收藏

51CTO技術棧公眾號

后进极品白嫩翘臀在线视频| 亚洲精品自拍视频在线观看| www.成人爱| 国产精品丝袜久久久久久app| 91精品久久久久久久久久久久久| 免费一级全黄少妇性色生活片| 日韩精品欧美大片| 欧美日韩免费在线视频| 69sex久久精品国产麻豆| 国产在线观看高清视频| 国产一区亚洲一区| 欧日韩在线观看| 日本黄色片免费观看| 国产精品xxxav免费视频| 日本高清成人免费播放| 国产激情片在线观看| 国产午夜视频在线观看| 国产成人亚洲精品青草天美| 国产高清在线不卡| 国产精品美女毛片真酒店| 日韩黄色大片| 国产丝袜一区视频在线观看 | 蜜臀91精品一区二区三区 | 国产丝袜一区二区| 免费黄色av网址| 国产成人精品一区二区三区免费| 五月激情六月综合| 大片在线观看网站免费收看| 成人免费在线视频网| www.亚洲色图| 国产精品一区二区三区在线观| 亚洲综合视频在线播放| 久久久亚洲人| 欧美一区二区三区图| 久视频在线观看| 欧美在线1区| 久久精品99久久久久久久久 | 日本黄色免费视频| 国产aⅴ精品一区二区三区色成熟| 国产精品成人一区| 东京热一区二区三区四区| 亚洲美女少妇无套啪啪呻吟| 久久久久久久91| 欧美激情国产精品免费| 91成人网在线观看| 另类美女黄大片| 三级av在线免费观看| 日韩欧美伦理| 久久精品国产亚洲精品| 黑人操日本美女| 久久国产综合| 久久亚洲国产精品| 成人涩涩小片视频日本| 婷婷另类小说| 欧美精品制服第一页| 五月天丁香激情| 欧美日韩成人| 久久久久亚洲精品国产| 日韩免费黄色片| 亚洲影院在线| 国产成人精品综合| 中文字幕有码无码人妻av蜜桃| 秋霞影院一区二区| 国产日韩欧美日韩大片| 99热这里只有精品1| 国产一区二区三区香蕉| 成人自拍爱视频| 午夜性色福利视频| 国产欧美日韩卡一| 杨幂一区欧美专区| 直接在线观看的三级网址| 亚洲图片欧美视频| 久久久久久久久久久视频| 亚洲福利影院| 欧美午夜电影网| 亚洲AV无码久久精品国产一区| 超碰精品在线| 国产亚洲精品久久久久久| 美女福利视频网| 欧美+日本+国产+在线a∨观看| 久久久中精品2020中文| 国产中文字幕视频| 国产真实乱子伦精品视频| 国产精品久久久久久久小唯西川| 免费在线观看一级毛片| 最新热久久免费视频| 日韩黄色片在线| 欧美成a人片在线观看久| 欧美日本高清视频在线观看| 最新版天堂资源在线| 免费看成人吃奶视频在线| 日韩在线免费视频| 日韩av女优在线观看| 日本91福利区| 国产伦精品一区二区三区高清| 精品亚洲综合| 亚洲一区二区视频在线观看| 无码aⅴ精品一区二区三区浪潮| www.成人在线视频| 亚洲二区在线播放视频| 特级西西人体高清大胆| 亚洲人体大胆视频| 成人免费看吃奶视频网站| 四虎精品在永久在线观看| 亚洲欧洲色图综合| 成人黄色av片| 国产精品久久久久久吹潮| 精品播放一区二区| 自拍偷拍第9页| 性娇小13――14欧美| 96精品久久久久中文字幕| 邻居大乳一区二区三区| 亚洲专区一二三| www.五月天色| 成人在线国产| 国产99久久精品一区二区| 成人小说亚洲一区二区三区| 国产精品成人一区二区三区夜夜夜| 热99这里只有精品| 高清不卡一区| 最新69国产成人精品视频免费| 日日夜夜综合网| 国产 日韩 欧美大片| 中文视频一区视频二区视频三区| 欧美电影免费看| 日韩毛片在线观看| 国产污视频在线看| 国产ts人妖一区二区| 福利网在线观看| 亚洲伊人伊成久久人综合网| 中文字幕欧美精品日韩中文字幕| 99久热在线精品996热是什么| 国产精品一二三区| 久久天天东北熟女毛茸茸| 99精品在线免费观看| yellow中文字幕久久| 中文字幕777| 中文字幕不卡在线| 国产视频在线视频| 精品国产一区二区三区香蕉沈先生 | 日韩视频一区| 久精品国产欧美| h片在线观看下载| 亚洲第一偷拍网| 久久综合激情网| 成人一区二区三区在线观看 | 超碰97免费在线| 精品久久久久久久久久久久久久久 | 精品中文字幕在线播放| 亚洲国产黄色| 久久精品二区| 桃花岛tv亚洲品质| 永久免费毛片在线播放不卡| 欧美三级网站在线观看| 欧美韩国日本综合| 久久婷五月综合| 小处雏高清一区二区三区| 91精品视频播放| 91精选在线| 精品久久久久一区| 国产 欧美 日韩 在线| 91网站最新网址| 少妇性l交大片| 天天久久综合| 超碰97在线播放| 欧美调教sm| 国产一区二区三区高清在线观看| 中文天堂在线视频| 亚洲三级在线看| 亚洲午夜久久久久久久久| 国产精品美女| 亚洲精品一区二区三| 国产亚洲高清一区| 91精品国产99久久久久久| 青青草视频免费在线观看| 欧美午夜精品一区| 久久无码精品丰满人妻| 久久综合999| 欧美激情第一区| 91久久综合| 亚洲图片欧洲图片日韩av| 久久久久久久久久久久电影| 午夜精品久久久久久久久久久久| 国产在线91| 日韩欧美中文一区| 日韩精品成人免费观看视频| 国产精品激情偷乱一区二区∴| 中国男女全黄大片| 日本人妖一区二区| 日韩一级免费看| 精品国精品国产自在久国产应用 | 欧美性在线视频| 欧美三级电影一区二区三区| 亚洲第一av网站| 亚洲香蕉在线视频| 激情懂色av一区av二区av| 在线观看天堂av| 99久久99久久久精品齐齐| 污视频网站观看| 亚洲一区二区三区免费在线观看| 正在播放一区| 国产一区99| 国产精品免费一区二区三区| 欧美日韩卡一| 日本精品久久电影| 欧美videosex性极品hd| 中文字幕在线看视频国产欧美| 天天操天天操天天干| 在线成人午夜影院| 波多野结衣一区二区三区在线| 亚洲综合色区另类av| 欧美人与禽zoz0善交| 91亚洲精品一区二区乱码| 午夜视频在线观| 日本欧美加勒比视频| 青春草国产视频| 天天综合久久| 亚洲人成网站在线播放2019| 欧美性生活一级片| 成人在线视频电影| 免费一级欧美在线大片| 国产精品视频久久久| 天堂电影一区| 97在线观看视频国产| 四虎影院观看视频在线观看| 色哟哟网站入口亚洲精品| 巨骚激情综合| 精品偷拍各种wc美女嘘嘘| 欧美一级做性受免费大片免费 | 神马久久久久久久久久| 欧美一级淫片007| 国产又粗又长又大视频| 欧美日韩一卡二卡三卡| 337p粉嫩色噜噜噜大肥臀| 一本色道久久加勒比精品| 欧美日韩精品区| 精品久久久久久久大神国产| xxxx 国产| 亚洲地区一二三色| 福利一区二区三区四区| 亚洲第一久久影院| 国产91av视频| 精品久久久视频| 中文字幕第四页| 日本韩国一区二区| 在线观看中文字幕2021| 欧美视频一区在线| 亚洲影院一区二区三区| 欧美精品日韩一区| 国产色综合视频| 日韩免费高清视频| 欧美综合视频在线| 亚洲激情在线观看视频免费| 神马一区二区三区| 国产视频综合在线| 国产精品天堂| 日韩中文字幕国产| 91在线中文| 久久久久成人精品| 在线日韩影院| 国产精品美女午夜av| 亚洲欧洲二区| 国产精品v欧美精品v日韩精品| 免费成人蒂法| 日韩免费av一区二区三区| 91精品精品| 日本男女交配视频| 国产日韩一区二区三区在线播放 | 激情综合色播五月| 668精品在线视频| 另类中文字幕国产精品| 81精品国产乱码久久久久久| av一区在线播放| 91久久久一线二线三线品牌| xxxx日韩| 亚洲精品一区二| 亚洲先锋成人| 日韩精品无码一区二区三区免费 | 91精品国产乱码久久久久久| 国产对白在线播放| 亚洲日本视频| 黑人巨大国产9丨视频| 五月开心六月丁香综合色啪 | 蜜桃传媒视频麻豆第一区免费观看| 精品免费视频| 欧美黑人在线观看| 91欧美在线| 国产九九九九九| 狠狠色综合日日| 91精品人妻一区二区三区蜜桃2| 国内成人精品2018免费看| 手机免费看av片| 国产精品久久久久久妇女6080| 成人在线免费高清视频| 久久黄色网页| 国产成人av免费观看| 国产三级精品三级| 久久精品国产亚洲av高清色欲| 精品视频999| 午夜福利理论片在线观看| 日韩中文理论片| 小草在线视频免费播放| 欧美日韩视频一区二区| 激情五月俺来也| 97se亚洲国产综合自在线不卡| 色哟哟一一国产精品| 欧美午夜视频一区二区| 国产情侣小视频| 日韩精品中文在线观看| sese一区| 亚洲一级片在线看| 国产福利电影在线播放| 亚洲综合第一页| 国产一区二区区别| 日韩视频在线播放| 国产一区二区高清| 国产乱国产乱老熟300部视频| 国产精品成人网| 在线观看毛片av| 国产午夜精品全部视频在线播放 | 久久国产一区| 中文字幕乱码亚洲无线精品一区| 日韩福利视频在线| 久久免费精品国产久精品久久久久| 精品一区二区三区人妻| 欧美一区二区三区免费大片| 天堂а√在线资源在线| 国产精品成久久久久三级| 免费成人av| 欧美v亚洲v综合ⅴ国产v| 99久久精品国产色欲| 欧美一区二区三区性视频| 无码国产精品一区二区色情男同| 自拍偷拍亚洲区| 色在线视频网| 亚洲xxxx3d| 激情综合网五月| 精品国产一区三区| 亚洲经典在线| 女同性恋一区二区三区| 亚洲午夜在线视频| 亚洲精品人妻无码| 久久精品人人爽| 国产麻豆一区二区三区| 欧美日本韩国国产| 成人在线免费观看91| 中文字幕第38页| 亚洲天堂av老司机| www.成人在线观看| 色综合久久悠悠| 日本少妇精品亚洲第一区| 国产三级中文字幕| 国产综合久久久久久鬼色 | 久久夜色精品一区| 日本一区二区不卡在线| 一区二区三区免费网站| 国产精品久久久久久久久久精爆| 欧美在线你懂得| 午夜激情在线观看| 国产www精品| 久久看人人摘| 午夜性福利视频| 亚洲欧美精品午睡沙发| 久久久久亚洲av成人毛片韩| 亚洲天堂免费观看| 四虎地址8848精品| 久久亚洲精品无码va白人极品| 99re热这里只有精品免费视频| 久久久蜜桃一区二区| 日韩在线观看视频免费| 人成免费电影一二三区在线观看| 国产精品国产三级国产普通话蜜臀| 欧美日韩亚洲国产另类| 精品一区二区电影| 免费视频成人| 日韩在线观看a| 国产欧美视频在线观看| 黄色免费一级视频| 欧美日韩国产色| 第九色区av在线| 日韩一区二区影院| 日韩电影免费看| 中文字幕一区二区三区在线乱码| 国产精品综合二区| 18精品爽视频在线观看| 国产亚洲精品久久久| 亚洲一区电影| 青青草精品视频在线观看| 亚洲在线视频免费观看| 九一国产在线| 91综合免费在线| 日韩高清一级片| 日本激情视频一区二区三区| 日韩欧美视频一区二区三区| 在线观看免费黄色| 国产一区二区在线网站| 精品影院一区二区久久久| 久久久久女人精品毛片九一| 久色乳综合思思在线视频| 激情婷婷综合|