Golang的內(nèi)存管理--學(xué)習(xí)筆記
Go的內(nèi)存管理內(nèi)存的分級arena區(qū)SpansGo中的mspan內(nèi)存管理組件mcachemcentralmheap內(nèi)存的分配流程內(nèi)存的分級使用的是多級分配的辦法將內(nèi)存分為多級進行分級管理從而降低鎖的粒度。并且將可用的堆內(nèi)存采用二級管理其中每個線程會有一個自己的內(nèi)存池只有在自己的內(nèi)存池不夠時才會去全局內(nèi)存中獲取夠用時首先使用自己的內(nèi)存池?;靖拍頰rena區(qū)arena是堆區(qū)即動態(tài)分配區(qū)域被分隔成8k大小的頁將頁組合起來稱為mspan。bitmap區(qū)域標識arena區(qū)域的那些地址保存了對象并且使用4bit標識對象是否包含指針、GC標記信息。bitmap的的一個byte大小的內(nèi)存標識的是arena的4個指針大小的內(nèi)存一個是8b因此bitmap的大小512GB/(4*8B)16GB。Spansspans中保存的是mspan是arena中分隔頁組成的基本內(nèi)存管理單元的指針每個指針對應(yīng)一頁會出現(xiàn)多個s指向同一個mspan每一個mspan中也保存了對應(yīng)的spans在回收時可以快速的找到Go中的mspanmspan是go內(nèi)存管理的基本單元是一片連續(xù)的8kb的頁組成的大塊內(nèi)存。mspan的特點mspan是包含頁的起始地址頁的span規(guī)格和頁的數(shù)量的雙端鏈表關(guān)于mspan和object的關(guān)系mspan是根據(jù)自身的SizeClass來分割成若干個object一個object可儲存一個對象在為對象分配內(nèi)存的時候mspan會分配一個和object大小接近的對象SizeClass和SpanClass的概念Size_Class Span_Class / 2由計算方式可以看出每一個Span_Class中有兩個mspan。一個分配給包含有指針的對象一個分配給不包含指針的對象。mspan和SizeClass在Go1.9中mspan的SizeClass有67種每個mspan分割的object大小是8*2n的倍數(shù)寫在代碼中// path: /usr/local/go/src/runtime/sizeclasses.go const _NumSizeClasses 67 var class_to_size [_NumSizeClasses]uint16{0, 8, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536,1792, 2048, 2304, 2688, 3072, 3200, 3456, 4096, 4864, 5376, 6144, 6528, 6784, 6912, 8192, 9472, 9728, 10240, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768}在使用SizeClass的時候其中為0表示大對象直接由對內(nèi)存分配小對象通過mspan來分配SizeClass也決定了mspan所能分配的頁數(shù)寫死在代碼中上圖中由兩個S指向同一個mspan這是因為兩個s指向的P同屬一個mspan因此方便了互相查找。startAddr 直接指向了arena區(qū)域表示mspan的起始地址allocBIts指向一個位圖每位代表一個塊是否被分配了對象allocCount 表示已經(jīng)分配的對象個數(shù)內(nèi)存管理組件Go中的分配器的3中組件的構(gòu)成mcachemcentralmheapmcacheGo中為每個邏輯處理器P提供一個本地線程緩存即mcache每個P同一時間只能運行一個goroutine因此訪問mcache是不需要加鎖mcache的結(jié)構(gòu)體定義//path: /usr/local/go/src/runtime/mcache.go type mcache struct { alloc [numSpanClasses]*mspan } numSpanClasses _NumSizeClasses 1mcache中使用numSpanClasses作為索引管理多個用于分配的mspan包含了所有規(guī)格的mspannumSpanClasses是mspan中介紹的_NumSizeClasses的2倍數(shù)組中的一半mspan是分配給有指針的對象一半是給沒有指針的對象。在垃圾回收的時候沒有指針的就不需要進一步掃描了mcache的初始化在初始化時沒有mspan資源使用過程中動態(tài)的從mcentral申請會緩存起來對象小于等于32k時使用mcashe中的mspan。mcentralmecntral為mcache提供切分好的mspan資源每個mcentral保存一種特定大小的全局mspan列表分配的和未分配的mcentral被所有的工作線程共同享有存在競爭有鎖機制//path: /usr/local/go/src/runtime/mcentral.go type mcentral struct { // 互斥鎖 lock mutex // 規(guī)格 sizeclass int32 // 尚有空閑object的mspan鏈表 nonempty mSpanList // 沒有空閑object的mspan鏈表或者是已被mcache取走的msapn鏈表 empty mSpanList // 已累計分配的對象個數(shù) nmalloc uint64 }圖中的內(nèi)容和結(jié)構(gòu)體對應(yīng)獲取mspan和歸還流程獲取加鎖從nonempty鏈表找到一個可用的mspan并將其從nonempty中刪除將取出的mspan加入到empty鏈表將mspan返回給工作線程解鎖歸還加鎖將mspan從empty鏈表刪除將mspan加入到nonempty鏈表解鎖mheapmheap代表Go程序持有的所有堆空間Go程序使用一個mheap的全局對象_mheap來管理當mcentral中沒有空閑的mspan時會向mheap申請沒有mheap時會向操作系統(tǒng)申請。mheap的主要工作大對象分配內(nèi)存管理未切割的mspan內(nèi)存的分配流程32k直接從mheap上分配16B的對象使用mcache的tiny分配器分配二者之間的首先計算對象規(guī)格然后從mcache中相應(yīng)的mspan中分配如果mcache中沒有則向mcentral申請mcentral中沒有則向mheap申請mheap中沒有則找操作系統(tǒng)。

相關(guān)新聞

SpringBoot集成OnlyOffice實現(xiàn)文檔實時協(xié)作開發(fā)指南

SpringBoot集成OnlyOffice實現(xiàn)文檔實時協(xié)作開發(fā)指南

1. 項目背景與核心價值在傳統(tǒng)辦公場景中,Word文檔的協(xié)作往往需要通過郵件反復(fù)發(fā)送附件,版本管理混亂且效率低下。我們團隊最近在開發(fā)一個知識管理系統(tǒng)時,就遇到了文檔實時協(xié)作的痛點。經(jīng)過技術(shù)選型,最終選擇通過SpringBoot集成Onl…

2026/7/28 20:14:42 閱讀更多
全棧生信分析實戰(zhàn):Python+R+Docker高效流程搭建

全棧生信分析實戰(zhàn):Python+R+Docker高效流程搭建

1. 項目概述:全棧生信分析的核心價值 在生物信息學(xué)領(lǐng)域,Python和R語言就像實驗室里的移液槍和離心機——前者靈活通用適合流程搭建,后者專精統(tǒng)計可視化。這個實戰(zhàn)指南要解決的問題很明確:讓沒有生信背景的科研人員或轉(zhuǎn)行開發(fā)者&am…

2026/7/28 20:14:42 閱讀更多
SQL注入四種類型詳解:原理、利用與防御

SQL注入四種類型詳解:原理、利用與防御

1. 什么是 SQL 注入?SQL 注入是指攻擊者將惡意 SQL 代碼插入到輸入?yún)?shù)中,應(yīng)用程序未進行過濾便將其拼接到 SQL 查詢語句中,導(dǎo)致數(shù)據(jù)庫執(zhí)行了非預(yù)期的命令。一句話解釋就是你輸入的內(nèi)容被直接當作代碼執(zhí)行了2. 四種常見類型2.1 聯(lián)合查詢注入 …

2026/7/29 6:06:06 閱讀更多
機器學(xué)習(xí)與深度學(xué)習(xí):核心差異與實戰(zhàn)應(yīng)用指南

機器學(xué)習(xí)與深度學(xué)習(xí):核心差異與實戰(zhàn)應(yīng)用指南

1. 機器學(xué)習(xí)與深度學(xué)習(xí):從理論到實戰(zhàn)的全方位解析 在數(shù)據(jù)爆炸的時代,機器學(xué)習(xí)(Machine Learning)和深度學(xué)習(xí)(Deep Learning)已經(jīng)成為推動技術(shù)進步的核心引擎。作為一名從業(yè)多年的數(shù)據(jù)科學(xué)家,我見…

2026/7/29 6:06:06 閱讀更多
NSAIDs藥物全解析:從作用機制到安全使用指南

NSAIDs藥物全解析:從作用機制到安全使用指南

1. 從“止痛藥”到“抗炎藥”:重新認識NSAIDs 在藥柜里,布洛芬、阿司匹林、雙氯芬酸鈉這些名字你一定不陌生。頭疼腦熱、關(guān)節(jié)酸痛、運動拉傷,我們總會習(xí)慣性地求助于它們。但你是否想過,這些被我們籠統(tǒng)稱為“止痛藥”的家伙&#…

2026/7/29 6:06:06 閱讀更多
51單片機LED點陣廣告牌設(shè)計:從硬件驅(qū)動到軟件掃描全解析

51單片機LED點陣廣告牌設(shè)計:從硬件驅(qū)動到軟件掃描全解析

1. 項目概述:從零到一,打造一個會“說話”的LED點陣廣告牌最近在帶學(xué)生做單片機課設(shè),發(fā)現(xiàn)“LED點陣廣告牌設(shè)計”這個題目真是經(jīng)久不衰。它麻雀雖小,五臟俱全,幾乎涵蓋了單片機應(yīng)用開發(fā)的所有核心環(huán)節(jié):從硬件…

2026/7/29 6:06:06 閱讀更多
Spring Security OAuth2 Scope驗證全流程解析與實戰(zhàn)

Spring Security OAuth2 Scope驗證全流程解析與實戰(zhàn)

1. 項目概述:為什么我們需要深入理解OAuth2的scope驗證? 如果你正在開發(fā)或維護一個基于Spring Security OAuth2的授權(quán)服務(wù)器或資源服務(wù)器,那么“scope驗證”這個環(huán)節(jié),很可能就是你系統(tǒng)安全防線上最容易被忽視,卻又至關(guān)…

2026/7/29 5:56:05 閱讀更多
面試官大笑:“一個任務(wù)拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個任務(wù)拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個問題:在 Claude Code 里把一個任務(wù)拆給 5 個 Subagent 并行跑,結(jié)果可能比 1 個 agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實擲骰子的過程。應(yīng)用投擲兩個骰子(六面標準骰),使用 Unicode 骰面符號直觀展示每個骰子的點數(shù),并伴有快速滾動的動畫效果。…

2026/7/29 0:15:24 閱讀更多