1. <dd id="erndk"></dd>
                1. Go 內存管理

                  互聯網 2022/4/29 7:14:19

                  Go 實現了類似于 TCMalloc 的多協程內存分配(malloc)策略,并使用基于標記-清除的三色標記法進行內存垃圾回收(GC)。 TCMalloc TCMalloc( Thread-Caching Malloc)是 Google 對 C 中的 malloc() 和 C++ 中的 operator new 的自定義實現,目的是實現一套快速而且支持多…

                  Go 實現了類似于 TCMalloc 的多協程內存分配(malloc)策略,并使用基于標記-清除的三色標記法進行內存垃圾回收(GC)。

                  TCMalloc

                  TCMalloc( Thread-Caching Malloc)是 Google 對 C 中的 malloc() 和 C++ 中的 operator new 的自定義實現,目的是實現一套快速而且支持多線程的內存分配器。

                  TCMalloc 在架構上分為三層,分別是:

                  1. 前端層(Front-end):包括線程緩存(Per-thread cache)和CPU緩存(Per-CPU cache),面向用戶代碼;
                  2. 中間層(Middle-end):由傳輸緩存(Transfer cache)和中央空閑列表(Central free list)構成,負責回填(refill)前端層緩存,促使緩存在線程或CPU之間流動;
                  3. 后端層(Back-end):由傳統頁堆(Legacy page heap)和大頁感知頁堆(Hugepage aware pageheap)構成,負責從 OS 中獲取內存。

                  Diagram of TCMalloc internal structure

                  GC

                  Go 中的 GC 策略是:基于標記-清除的三色標記法。主要包括以下過程:

                  1. 棧掃描(Stack scan):掃描棧中的根對象,并開啟寫屏障;
                  2. 標記(Mark):使用黑灰白三種顏色對對象進行染色,所有對象默認為白色。開始將根對象染為黑色,然后將根對象引用的對象染為灰色,如此一輪輪染色,直到不存在灰色對象(灰色為中間狀態),那么白色的對象就是未被引用的對象。
                  3. 標記結束(Mark termination):STW(stop the world),重新掃描部分全局變量和局部變量,結束標記,結束寫屏障。
                  4. 清除(Sweap):并發清除未標記的(白色的)對象。

                  Go GC phrase

                  參考

                  1. TCMalloc : Thread-Caching Malloc
                  2. Go GC: Latency Problem Solved
                  隨時隨地學軟件編程-關注百度小程序和微信小程序
                  關于找一找教程網

                  本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
                  本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
                  [Go 內存管理]http://www.yachtsalesaustralia.com/tech/detail-317945.html

                  贊(0)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  掃一掃關注最新編程教程
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>