Go 內(nèi)存管理 -- 內(nèi)存分配 一

前言

go作為一個(gè)比較新晚(新)的語言,自然借鑒前輩們的優(yōu)點(diǎn),比如說語言本身負(fù)責(zé)內(nèi)存管理、對協(xié)程和高并發(fā)的高優(yōu)支持、簡單高效的語法等。本篇及后續(xù)的幾篇要講的就是還沒提到的比較復(fù)雜的內(nèi)存管理。
學(xué)習(xí)內(nèi)存管理(分配&回收)前,如果有JVM的內(nèi)存管理的基礎(chǔ),會(huì)變得非常簡單,如果是第一次接觸內(nèi)存管理,在看完Go的內(nèi)存管理后可以去看看JVM的,對比著學(xué)習(xí)比較容易理解。
go的內(nèi)存管理思路是基于google 的tcmalloc(thread-caching-malloc)實(shí)現(xiàn)的,常見的內(nèi)存分配器還有ptmalloc、jemalloc,但是tcmalloc的性能更高,尤其是高并發(fā)場景下。

關(guān)于tcmalloc

tcmalloc的分配的內(nèi)存主要來源于:全局緩存堆、進(jìn)程私有緩存,小容量的內(nèi)存申請使用私有緩存,如果私有緩存不夠,則從全局緩存堆中申請一部分作為私有緩存。大對象會(huì)直接從全局緩存中申請,至于大小的分界是32k。

小對象分配

小對象內(nèi)存分配默認(rèn)會(huì)分配86個(gè)不同大小的塊,這些塊的大小不一致,內(nèi)部采用單鏈表數(shù)組來組織內(nèi)存,使用時(shí)遵循懶加載策略,等到使用時(shí)才進(jìn)行初始化。


image.png
大對象分配

大于32k的內(nèi)存申請,屬于大對象的分配,使用全局緩存堆直接分配,內(nèi)存的組織方式也是通過單鏈表數(shù)組進(jìn)行的,數(shù)據(jù)長度是256,每個(gè)鏈表的元素的大小是不同的,但都是4k(1page)的整數(shù)倍。


image.png
Span

tcmalloc使用span來管理內(nèi)存分頁,一個(gè)span可以包含幾個(gè)連續(xù)分頁。span的狀態(tài)只有未分配、作為大對象分配、作為小對象分配。

go內(nèi)存分配

主流程

1、申請一塊較大的虛擬內(nèi)存空間,用于內(nèi)存分配及管理
當(dāng)空間不足時(shí),向系統(tǒng)申請一塊較大的內(nèi)存,如100KB或者1MB
申請到的內(nèi)存塊按特定的size,被分割成多種小塊內(nèi)存(go:_NumSizeClasses = 67),并用鏈表管理。創(chuàng)建對象時(shí),按照對象大小,從空閑鏈表中查找到最適合的內(nèi)存塊。
2、銷毀對象時(shí),將對應(yīng)的內(nèi)存塊返還空閑鏈表中以復(fù)用。
3、空閑內(nèi)存達(dá)到最大值時(shí),返還操作系統(tǒng)。

管理組件

go將內(nèi)存分為三個(gè)層級,協(xié)程私有內(nèi)存,全局內(nèi)存,整體內(nèi)存葉管理,也因此有這三個(gè)層級的內(nèi)存管理工具。


image.png

mspan: mspan并不直接擁有內(nèi)存空間,它負(fù)責(zé)管理起始地址為startAddr、級別(預(yù)分配頁的個(gè)數(shù))為sizeclass的連續(xù)地址空間。
mcache: Per-P私有cache,用于實(shí)現(xiàn)無鎖的object分配,每個(gè)mcache有大小為67的mspan數(shù)組,存儲不同級別大小的mspan。
mcentral: 全局內(nèi)存,為各個(gè)cache提供按大小劃分好的mspan,mcentral有個(gè)關(guān)鍵方法cacheSpan(),它是整個(gè)分配的核心算法
mheap 是真實(shí)擁有虛擬地址的結(jié)構(gòu),page管理,內(nèi)存不足時(shí)向系統(tǒng)申請。
總體來說,他們之間的關(guān)系是這樣的:
Golang程序啟動(dòng)時(shí)申請一大塊內(nèi)存,并劃分成spans、bitmap、arena區(qū)域,arena區(qū)域按頁劃分成一個(gè)個(gè)小塊,span管理一個(gè)或多個(gè)頁,mcentral管理多個(gè)span供線程申請使用,mcache作為線程私有資源,資源來源于mcentral。
本篇暫時(shí)就介紹這么多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容