精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩黄色网络| 亚洲十八**毛片| 国产成人免费在线| 91禁国产网站| 欧美一区二区三区粗大| 国产专区精品| 欧美性xxxxxxxxx| 亚洲午夜精品一区二区| 亚洲国产精品久久久久爰性色| 一本色道久久综合一区| 日韩有码在线播放| 欧美一级大片免费看| 欧美日韩123区| 亚洲激情自拍视频| 日韩在线第一区| 亚洲av少妇一区二区在线观看| 久久国产毛片| 欧美日韩第一视频| 人人爽人人爽人人片| 成人资源在线播放| 欧美区在线观看| 国产精品va无码一区二区| 黄色网页在线观看| 91麻豆免费视频| 91文字幕巨乱亚洲香蕉| 国产精品传媒在线观看| 亚洲精品乱码| 久久夜色精品国产| 人妻视频一区二区| 亚瑟一区二区三区四区| 日韩欧美中文字幕制服| 三上悠亚av一区二区三区| 僵尸再翻生在线观看免费国语| 亚洲人成网站色在线观看| 欧美日韩一区二区视频在线观看| 成人av手机在线| 久久99精品久久久久久动态图| 欧美在线不卡区| 久久艹精品视频| 91tv官网精品成人亚洲| 色偷偷综合社区| 国产jk精品白丝av在线观看| 欧美aaaaaaaa牛牛影院| 精品久久人人做人人爽| 欧美高清精品一区二区| 在线日韩三级| 欧美区一区二区三区| 日本老熟妇毛茸茸| 成人软件在线观看| 欧美视频在线观看免费网址| 亚洲熟妇av日韩熟妇在线| 女子免费在线观看视频www| 亚洲免费观看在线视频| 国产盗摄视频在线观看| 最新国产在线观看| 国产精品毛片大码女人| 亚洲人成影视在线观看| a中文在线播放| 国产欧美一区在线| 一本色道久久99精品综合| 高清毛片在线看| 亚洲国产精品成人综合色在线婷婷 | 亚洲欧美日韩在线观看a三区 | 亚洲欧美激情精品一区二区| 六十路息与子猛烈交尾| 欧美激情15p| 国产视频综合在线| 女人十八毛片嫩草av| 四虎成人av| 精品国产网站地址| 欧美日韩精品亚洲精品| 亚洲福利免费| 日韩av电影在线播放| 久久久久久久亚洲| 麻豆久久久久久| 亚洲wwwav| 少妇一区二区三区四区| 国产视频在线观看一区二区三区 | 欧美性69xxxx肥| 久久久精品麻豆| 9.1麻豆精品| 欧美成人一区二区三区在线观看 | 99久久久无码国产精品6| 亚洲精品国产嫩草在线观看| 欧美日韩国产区一| 91亚洲一线产区二线产区| 欧美人妖视频| 中文字幕av一区| 欧美人与禽zozzo禽性配| 国产亚洲在线观看| 国产在线日韩在线| 黄色一级a毛片| 欧美激情中文字幕| av网站大全免费| 伊人久久高清| 日韩精品一区二区三区视频播放| 亚洲成人日韩在线| 91亚洲人成网污www| 午夜精品国产精品大乳美女| 最近中文字幕在线观看视频| 国产成人啪免费观看软件 | 男人添女人荫蒂国产| 日韩精品导航| 久久久精品久久| 久热这里只有精品6| 蜜桃一区二区三区四区| 国产一区二区精品免费| 1769在线观看| 欧美日韩亚洲国产一区| 韩国一区二区在线播放| 亚洲人成精品久久久| 久久国产天堂福利天堂| 无码人妻久久一区二区三区| 国产91丝袜在线观看| 色综合视频二区偷拍在线| 538在线精品| 91精品啪在线观看国产60岁| 亚洲一级中文字幕| 极品裸体白嫩激情啪啪国产精品 | 日本一区二区三区播放| 中文字幕欧美日韩| 国产原创视频在线| 国产精品一二三四| 亚洲精品一区二| 国产日韩电影| 亚洲国产欧美一区二区三区久久| 天天看片中文字幕| 精品一区二区三区在线观看国产| 欧美精品久久久| 免费一二一二在线视频| 亚洲精品在线免费观看视频| 日韩精品一区二区亚洲av性色| 日本午夜精品一区二区三区电影| 九九九热999| 黄色小说在线播放| 日韩一区二区三区视频在线| 麻豆一区在线观看| 日本麻豆一区二区三区视频| 欧美二区三区| 午夜欧美激情| 国产视频在线观看一区二区| 五月天婷婷综合网| 成人午夜视频在线观看| www国产免费| 日韩精品一区二区三区中文在线| 色多多国产成人永久免费网站| 中文字幕一区二区人妻视频| 国产午夜精品久久久久久久| 欧美 国产 小说 另类| 亚洲精品亚洲人成在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 青青操视频在线| 婷婷开心激情综合| 新91视频在线观看| 久久精品官网| 亚洲啪啪av| 粉嫩av国产一区二区三区| 久久夜精品香蕉| 亚洲AV无码一区二区三区性| 亚洲一区二区美女| 久久久老熟女一区二区三区91| 亚洲精品美女91| 欧美污视频久久久| 69堂精品视频在线播放| zzjj国产精品一区二区| 国产伦理一区二区| 亚洲一区二区三区爽爽爽爽爽| 日本一级大毛片a一| 亚洲深夜影院| 日韩黄色影视| 国产免费区一区二区三视频免费| 美女国内精品自产拍在线播放| 后入内射欧美99二区视频| 精品欧美aⅴ在线网站| 成人精品999| 久久精品免费观看| 老子影院午夜伦不卡大全| 欧美美女啪啪| 国产久一一精品| 色呦呦呦在线观看| 国产视频精品自拍| 亚洲天天综合网| 亚洲最大成人网4388xx| 国产吞精囗交久久久| 日韩成人午夜电影| 奇米777四色影视在线看| 日韩av资源网| 国产精品一区二区久久久| 中文字幕在线观看播放| 日韩高清av一区二区三区| 在线观看国产黄| 亚洲h在线观看| 人人爽人人爽人人片| 国产不卡视频在线播放| 成年人小视频网站| 欧美日韩国产成人精品| 欧美三级电影在线播放| 国产精品日韩精品在线播放 | 欧美与亚洲与日本直播| 欧美大片va欧美在线播放| 亚洲欧美色视频| 91精品国产综合久久精品麻豆| www日韩精品| 亚洲三级免费电影| 新91视频在线观看| 成人午夜短视频| 五月天丁香花婷婷| 久久亚洲风情| 隔壁人妻偷人bd中字| 久久人人99| 农村寡妇一区二区三区| 911精品国产| 91精品在线观看视频| 肉色欧美久久久久久久免费看| 欧美激情一区二区三区成人| 秋霞午夜在线观看| 伊人男人综合视频网| 色综合888| 亚洲第一精品夜夜躁人人爽| 国产原创中文av| 在线观看国产日韩| 国产中文字幕视频| 天天影视网天天综合色在线播放| 欧美色图亚洲天堂| 亚洲视频在线观看三级| 一级黄色录像毛片| 久久久久久久精| 性色av蜜臀av色欲av| 国产99久久精品| 中文字幕 欧美 日韩| 黑人巨大精品欧美一区| 男人女人黄一级| 久久在线91| 激情五月开心婷婷| 国产精品婷婷| 自拍日韩亚洲一区在线| 国内一区二区三区| www.国产亚洲| 影音先锋日韩精品| 热这里只有精品| 五月婷婷六月综合| 中文字幕成人一区| 99视频精品全部免费在线视频| 亚洲美女搞黄| 欧美电影免费观看高清| 一区二区精品免费视频| 久久免费大视频| 中文字幕第50页| 中文字幕日韩欧美精品高清在线| 自拍偷拍视频在线| 欧美一区网站| 精品丰满人妻无套内射| 在线日本高清免费不卡| 激情五月宗合网| 麻豆精品网站| 亚洲一区二区三区四区五区xx| 奇米一区二区三区| 亚洲三级在线观看视频| 国产一区二区在线免费观看| 亚洲制服在线观看| 白白色 亚洲乱淫| 一级做a爰片毛片| 国产欧美日韩在线观看| www.99re6| 亚洲午夜精品在线| 亚洲精品男人天堂| 欧美亚洲图片小说| 国产人妻精品一区二区三区| 日韩美女视频一区二区在线观看| 天天干在线观看| 一区二区国产精品视频| 日本免费在线观看| 欧美激情亚洲精品| 欧洲亚洲两性| 成人观看高清在线观看免费| 综合中文字幕| 青青草久久网络| 在线中文字幕亚洲| ww国产内射精品后入国产| 日本亚洲视频在线| 天堂va欧美va亚洲va老司机| 91首页免费视频| 午夜国产福利视频| 午夜免费久久看| 这里只有久久精品视频| 日韩欧美成人一区| 日本护士...精品国| 久久天天躁狠狠躁夜夜av| а√在线中文在线新版| 国产精品久久久久久av下载红粉 | 精品亚洲第一| 日韩在线观看一区| 波多野结衣之无限发射| 捆绑紧缚一区二区三区视频 | 国产chinasex对白videos麻豆| 精品动漫一区二区三区在线观看| 国产裸舞福利在线视频合集| 九九久久久久99精品| 丝袜美腿诱惑一区二区三区| 1区1区3区4区产品乱码芒果精品| 日本韩国欧美超级黄在线观看| 亚洲国产精品一区二区第四页av| 国产一在线精品一区在线观看| 日韩手机在线观看视频| 国产91在线观看丝袜| jizz18女人高潮| 精品久久久久久久久久国产 | 一区二区日本伦理| 国产日韩高清一区二区三区在线| 在线免费看v片| 国产欧美日韩卡一| 国产 欧美 日韩 在线| 91精品久久久久久久91蜜桃| 成人高清在线| 88国产精品欧美一区二区三区| 国产亚洲字幕| 亚洲精品一区二区三区蜜桃久| 亚洲一区二区免费看| 精品人妻人人做人人爽夜夜爽| 国产精品午夜电影| 国产亚洲欧美在线精品| 亚洲国产成人久久| 亚洲wwwww| 亚洲一区二区在线播放| 91麻豆精品国产91久久久平台| 国产又黄又大又粗视频| 成人激情黄色小说| 青娱乐免费在线视频| 在线播放日韩导航| 亚洲视频tv| 国产精品美女久久久久久免费| 亚洲理论电影| 欧美成人xxxxx| 久久伊人中文字幕| 五月婷婷亚洲综合| 亚洲精品乱码久久久久久金桔影视| 黄色大片在线| 国产精品jizz视频| 精品1区2区3区4区| 欧美日韩人妻精品一区在线| 亚洲一区二区精品视频| 精品免费久久久| 麻豆国产精品va在线观看不卡 | 天堂网av2018| 欧美日韩在线三级| 午夜视频成人| 成人av色在线观看| 综合精品久久| 性高潮免费视频| 午夜激情一区二区三区| 香蕉久久国产av一区二区| 91国产精品视频在线| 西野翔中文久久精品字幕| 69堂免费视频| 国产婷婷一区二区| 一级黄色片免费| 欧美成人网在线| 成人精品毛片| 免费观看精品视频| 欧美极品少妇xxxxⅹ高跟鞋 | 色老太综合网| 亚洲欧洲一二三| 国产成人丝袜美腿| 国产又爽又黄的视频| 亚洲人成在线观看| 日韩免费大片| 中文字幕中文字幕在线中心一区| 国内成+人亚洲+欧美+综合在线 | 国内精品久久99人妻无码| 一本久道久久综合中文字幕 | 激情五月亚洲色图| 国产精品久久久久久久岛一牛影视 | 久久精品久久精品| 91在线播放观看| 亚洲国产精品女人久久久| 香蕉视频亚洲一级| 制服诱惑一区| av成人免费在线| 最近中文字幕在线免费观看 | 国产日韩另类视频一区| 一区二区三区精品国产| 懂色av噜噜一区二区三区av| 中文字幕第15页| 久久久av亚洲男天堂| 精品欧美午夜寂寞影院| 三级在线免费看| 亚洲一区在线观看免费| 九色视频在线观看免费播放| 91久久精品国产91久久性色| 亚洲美女黄网| 亚洲不卡的av| 亚洲国产精品久久91精品| 91精品国产66| 2018国产在线| 国产精品久久久久久久久搜平片| 免费看日韩av| 国产欧美日韩中文| 一本综合精品| 美女的奶胸大爽爽大片| 亚洲欧洲激情在线|