91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang的垃圾回收(GC)機制

發布時間:2020-06-11 13:24:14 來源:網絡 閱讀:826 作者:ck_god 欄目:編程語言

轉載自https://blog.csdn.net/liangzhiyang/article/details/52670021

請先閱讀 golanggoroutine調度機制然后再到這里


golang的垃圾回收采用的是 標記-清理(Mark-and-Sweep 算法

就是先標記出需要回收的內存對象快,然后在清理掉;

在這里不介紹標記和清理的具體策略(可以參考https://lengzzz.com/note/gc-in-golang),只介紹 GC過程是怎么調度的以及stw相關

這個算法,會導致 stw (stop the world)的問題,中斷用戶邏輯

觸發GC機制

1.    在申內存的候,檢查當前當前已分配的內存是否大于上次GC后的內存的2倍,若是(主GC線程為當前M

2.    監控線程發現上次GC時間兩分了,觸;將一個G放到全局G隊列中去。(主GC線程為執行這個GM

 

每當觸發的時候,在主GC線程中就會走如下的GC流程:

1.    stop the world,等待所有的M休眠;此所有的業務邏輯都停止

2.    標記:分配gc標記任務,喚醒 gcproc M(就是第一步休眠的那些),分個,直到所有的M都做完,才束;并且所有M再次入休眠

3.    清理:有一個獨的goroutine去清理已經標記的內存象快

4.    start the worldgcwaiting=0醒所有的M(不會超P個數)

 

對于上面的三個步驟,分別解釋:

stop the world

1.    設置gcwaiting=1個在每一個G之前會檢查一次個狀,如是,會將當前M休眠;

2.    如果M里面正在運行一個長時間G,咋呢,道會等待G自己切換嗎這樣可要等10ms啊,不能等!決不能等!
所以會主動發標記似于上一篇),當前G中斷,再運行下一個G候,就會走到第1

3.    一直等待所有的M進入休眠,此時所有的業務邏輯代碼都停

標記:

1.     根據gcproc的個數,分配成gcproc段;gcproc-1M行(當前M也算一個

2.    對于一個M醒前設置它的helpgc標記,喚醒之后這個M會立判斷標記,如是,開始做分配自己的標記務,如果先做完了,就會從別的M里面找一些來做

3.    等每一個M都做完,會再次入休眠

清理:

1.    過設置參數,可以以一個goroutine  運行,個功能是在1.3版本之后增加的,這樣就直接到下一步了,清理程不是stw

2.    也可以串行的在主GC線程執行;這樣的話則清理程也是stw的,

start the world

1.    設置gcwaiting=0

2.    喚醒PM繼續G(此沒有helpgc標記),業務邏輯代碼開

 

 

綜上:

是基于1.4版本的,GC過程在標記過程是(STW)的

1.5版本里面對GC做了很大的優化;采用三色標記,將標記過程細化成三段,只有前后的兩段是stw的;極大地縮短了gcstw時間

Golang的垃圾回收(GC)機制


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

咸宁市| 施甸县| 高雄市| 麻江县| 页游| 万源市| 柳州市| 长泰县| 新沂市| 毕节市| 克山县| 乌兰县| 原阳县| 南华县| 扶余县| 和田县| 高邮市| 衡南县| 定日县| 晴隆县| 嘉义市| 科尔| 玉田县| 崇礼县| 精河县| 松溪县| 东台市| 黄山市| 会同县| 鲁甸县| 奉节县| 调兵山市| 双峰县| 襄城县| 宜春市| 基隆市| 丹巴县| 分宜县| 都兰县| 嵊州市| 岳池县|