當前位置:成語大全網 - 書法字典 - Golang 1.14中的內存分配、清理和內存回收

Golang 1.14中的內存分配、清理和內存回收

Golang的內存分配由golang運行時完成,其內存分配方案借鑒了tcmalloc。

主要特點是

元素在本文中是指壹定大小的內存塊就是內存分配的概念,它出現在golang運行時源代碼中。

本文描述了x8664架構下的內存分配。

Golang內存分配有以下主要結構。

微小對象(Tiny object)是指內存大小小於16B的對象,這個對象的分配是使用mcache的微小區域進行的。當tiny area空間不足時,它會從mcache.alloc[tinySpanClass]指向的mspan中尋找空閑區域。當然,如果mcache中的span空間也被耗盡,就會觸發從mcentral向mcache補充mspan的過程。

小對象是指大小在(16B,32KB]之間的對象,這類對象的分配原則如下:

1.首先,根據對象的大小將其劃分為壹個跨度類,該跨度類中的所有元素大小壹致。

2.從MC cache . alloc[span class]中找到mspan,看看有沒有自由元素。如果有,則分配成功。如果妳不繼續。

3.從mcentral.allocSpan[SpanClass]的nonempty和emtpy中找到合適的mspan,並將其返回給mcache。如果找不到,就去mcentral。grow()->;Mheap.alloc()為mcentral分配壹個新的mspan。

大對象是指大小超過32KB的對象。此時直接從mheap分配,不會取mcache和mcentral。SpanClass==0的mspan將直接從mheap.alloc()中分配,以表示此分配的空間。

對於程序分配中常用的微小對象的分配,無鎖mcache可以提高分配性能。Mcache會在不夠用的時候取mcentral的鎖,然後從mcentral向mcache充mspan。大型對象直接從mheap分配。

在x8664環境下,golang管理的有效程序虛擬地址空間本質上只有48位。mheap中有壹個pagepagealloc成員來管理golang堆內存的地址空間。Golang為自己的管理向os申請地址空間。地址空間申請後,golang會根據實際使用情況將地址空間標記為空閑或alloc。如果地址空間被分配給mspan或壹個大對象,它被標記為alloc,反之亦然。

Golang認為地址空間有以下四種狀態:

Golang還定義了以下地址空間操作函數:

在mheap結構中,有壹個名為pages的成員,用於使用虛擬地址空間的golang堆管理。它的類型是pageAlloc。

用pageAlloc結構表示的golang堆的所有地址空間。兩個最重要的成員是:

在golang的gc進程中,未使用的對象將被標記為未使用,但這些對象使用的地址空間尚未返回到os。地址空間的申請和釋放都是基於golang的頁面(實際上是分塊的)。Sweep的最終結果只是標記了壹個要分配的地址空間,並沒有真正把地址空間釋放給os。真正的釋放是後面的清除過程。

Sweep()將用於嘗試釋放壹個跨度;gc標記後;mheap.alloc申請mspan的時候也是用sweep清理的。

清潔mspan主要涉及以下功能

如前所述,sweep只將頁面標記為可分配,但並不釋放地址空間;真正的地址空間釋放是清除過程。

真正的清除由pagealloc.scavenge ()->組成;SysUnused()釋放被掃描要釋放的塊所代表的地址空間(使用sysUnused()將地址空間返回給操作系統)。

golang有兩個清除過程: