Golang的內(nèi)存管理--學(xué)習(xí)筆記
Go的內(nèi)存管理內(nèi)存的分級(jí)arena區(qū)SpansGo中的mspan內(nèi)存管理組件mcachemcentralmheap內(nèi)存的分配流程內(nèi)存的分級(jí)使用的是多級(jí)分配的辦法將內(nèi)存分為多級(jí)進(jìn)行分級(jí)管理從而降低鎖的粒度。并且將可用的堆內(nèi)存采用二級(jí)管理其中每個(gè)線程會(huì)有一個(gè)自己的內(nèi)存池只有在自己的內(nèi)存池不夠時(shí)才會(huì)去全局內(nèi)存中獲取夠用時(shí)首先使用自己的內(nèi)存池。基本概念arena區(qū)arena是堆區(qū)即動(dòng)態(tài)分配區(qū)域被分隔成8k大小的頁將頁組合起來稱為mspan。bitmap區(qū)域標(biāo)識(shí)arena區(qū)域的那些地址保存了對(duì)象并且使用4bit標(biāo)識(shí)對(duì)象是否包含指針、GC標(biāo)記信息。bitmap的的一個(gè)byte大小的內(nèi)存標(biāo)識(shí)的是arena的4個(gè)指針大小的內(nèi)存一個(gè)是8b因此bitmap的大小512GB/(4*8B)16GB。Spansspans中保存的是mspan是arena中分隔頁組成的基本內(nèi)存管理單元的指針每個(gè)指針對(duì)應(yīng)一頁會(huì)出現(xiàn)多個(gè)s指向同一個(gè)mspan每一個(gè)mspan中也保存了對(duì)應(yīng)的spans在回收時(shí)可以快速的找到Go中的mspanmspan是go內(nèi)存管理的基本單元是一片連續(xù)的8kb的頁組成的大塊內(nèi)存。mspan的特點(diǎn)mspan是包含頁的起始地址頁的span規(guī)格和頁的數(shù)量的雙端鏈表關(guān)于mspan和object的關(guān)系mspan是根據(jù)自身的SizeClass來分割成若干個(gè)object一個(gè)object可儲(chǔ)存一個(gè)對(duì)象在為對(duì)象分配內(nèi)存的時(shí)候mspan會(huì)分配一個(gè)和object大小接近的對(duì)象SizeClass和SpanClass的概念Size_Class Span_Class / 2由計(jì)算方式可以看出每一個(gè)Span_Class中有兩個(gè)mspan。一個(gè)分配給包含有指針的對(duì)象一個(gè)分配給不包含指針的對(duì)象。mspan和SizeClass在Go1.9中mspan的SizeClass有67種每個(gè)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的時(shí)候其中為0表示大對(duì)象直接由對(duì)內(nèi)存分配小對(duì)象通過mspan來分配SizeClass也決定了mspan所能分配的頁數(shù)寫死在代碼中上圖中由兩個(gè)S指向同一個(gè)mspan這是因?yàn)閮蓚€(gè)s指向的P同屬一個(gè)mspan因此方便了互相查找。startAddr 直接指向了arena區(qū)域表示mspan的起始地址allocBIts指向一個(gè)位圖每位代表一個(gè)塊是否被分配了對(duì)象allocCount 表示已經(jīng)分配的對(duì)象個(gè)數(shù)內(nèi)存管理組件Go中的分配器的3中組件的構(gòu)成mcachemcentralmheapmcacheGo中為每個(gè)邏輯處理器P提供一個(gè)本地線程緩存即mcache每個(gè)P同一時(shí)間只能運(yùn)行一個(gè)goroutine因此訪問mcache是不需要加鎖mcache的結(jié)構(gòu)體定義//path: /usr/local/go/src/runtime/mcache.go type mcache struct { alloc [numSpanClasses]*mspan } numSpanClasses _NumSizeClasses 1mcache中使用numSpanClasses作為索引管理多個(gè)用于分配的mspan包含了所有規(guī)格的mspannumSpanClasses是mspan中介紹的_NumSizeClasses的2倍數(shù)組中的一半mspan是分配給有指針的對(duì)象一半是給沒有指針的對(duì)象。在垃圾回收的時(shí)候沒有指針的就不需要進(jìn)一步掃描了mcache的初始化在初始化時(shí)沒有mspan資源使用過程中動(dòng)態(tài)的從mcentral申請(qǐng)會(huì)緩存起來對(duì)象小于等于32k時(shí)使用mcashe中的mspan。mcentralmecntral為mcache提供切分好的mspan資源每個(gè)mcentral保存一種特定大小的全局mspan列表分配的和未分配的mcentral被所有的工作線程共同享有存在競(jìng)爭(zhēng)有鎖機(jī)制//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 // 已累計(jì)分配的對(duì)象個(gè)數(shù) nmalloc uint64 }圖中的內(nèi)容和結(jié)構(gòu)體對(duì)應(yīng)獲取mspan和歸還流程獲取加鎖從nonempty鏈表找到一個(gè)可用的mspan并將其從nonempty中刪除將取出的mspan加入到empty鏈表將mspan返回給工作線程解鎖歸還加鎖將mspan從empty鏈表刪除將mspan加入到nonempty鏈表解鎖mheapmheap代表Go程序持有的所有堆空間Go程序使用一個(gè)mheap的全局對(duì)象_mheap來管理當(dāng)mcentral中沒有空閑的mspan時(shí)會(huì)向mheap申請(qǐng)沒有mheap時(shí)會(huì)向操作系統(tǒng)申請(qǐng)。mheap的主要工作大對(duì)象分配內(nèi)存管理未切割的mspan內(nèi)存的分配流程32k直接從mheap上分配16B的對(duì)象使用mcache的tiny分配器分配二者之間的首先計(jì)算對(duì)象規(guī)格然后從mcache中相應(yīng)的mspan中分配如果mcache中沒有則向mcentral申請(qǐng)mcentral中沒有則向mheap申請(qǐng)mheap中沒有則找操作系統(tǒng)。

相關(guān)新聞

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

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

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

2026/8/1 19:17:12 閱讀更多
全棧生信分析實(shí)戰(zhàn):Python+R+Docker高效流程搭建

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

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

2026/8/2 0:26:11 閱讀更多
基于預(yù)訓(xùn)練模型與向量數(shù)據(jù)庫的十億級(jí)生物序列語義檢索系統(tǒng)構(gòu)建

基于預(yù)訓(xùn)練模型與向量數(shù)據(jù)庫的十億級(jí)生物序列語義檢索系統(tǒng)構(gòu)建

1. 項(xiàng)目概述:當(dāng)生物序列遇上“搜索引擎”最近在跟進(jìn)一些前沿的交叉領(lǐng)域研究,發(fā)現(xiàn)一個(gè)趨勢(shì)越來越明顯:AI大模型,特別是預(yù)訓(xùn)練語言模型,正在以前所未有的方式重塑生物信息學(xué)的研究范式。傳統(tǒng)的序列比對(duì)工具,像…

2026/8/2 4:54:57 閱讀更多
八大免費(fèi)激光點(diǎn)云數(shù)據(jù)集深度解析與實(shí)戰(zhàn)應(yīng)用指南

八大免費(fèi)激光點(diǎn)云數(shù)據(jù)集深度解析與實(shí)戰(zhàn)應(yīng)用指南

1. 項(xiàng)目概述:為什么你需要一個(gè)高質(zhì)量的點(diǎn)云數(shù)據(jù)集庫在三維視覺、自動(dòng)駕駛、機(jī)器人導(dǎo)航這些領(lǐng)域摸爬滾打久了,你會(huì)發(fā)現(xiàn)一個(gè)殘酷的現(xiàn)實(shí):想法很豐滿,數(shù)據(jù)很骨感。無論是想驗(yàn)證一個(gè)新算法,還是訓(xùn)練一個(gè)魯棒的模型&#xff…

2026/8/2 4:54:57 閱讀更多
我讓 Codex 自己維護(hù) NoteDeep 官方文檔

我讓 Codex 自己維護(hù) NoteDeep 官方文檔

NoteDeep 文檔中心有一個(gè)編輯器示例頁:數(shù)學(xué)公式顯示異常,后來新增的白板、腦圖、圖表和智能表格也沒有補(bǔ)進(jìn)去。 這種頁面不難改,麻煩的是先理解格式約定,再找到問題、修改內(nèi)容并逐項(xiàng)檢查。 解決方案 我把目標(biāo)頁面交給 Codex&…

2026/8/2 4:54:57 閱讀更多
電賽視覺控制:從像素到世界的坐標(biāo)轉(zhuǎn)換與系統(tǒng)性偏差排查

電賽視覺控制:從像素到世界的坐標(biāo)轉(zhuǎn)換與系統(tǒng)性偏差排查

如果你正在為電賽H題(無論是2024年還是2026年)中“小車/機(jī)械臂總是走到圓的外面”而抓狂,那么這篇文章就是為你準(zhǔn)備的。這絕不是一個(gè)簡(jiǎn)單的“參數(shù)調(diào)不好”的問題,它背后往往是一連串從視覺識(shí)別、坐標(biāo)轉(zhuǎn)換到運(yùn)動(dòng)控制環(huán)環(huán)相扣的“系…

2026/8/2 4:54:57 閱讀更多
保姆級(jí)PyTorch GPU環(huán)境配置:從Anaconda到CUDA兼容性全解析

保姆級(jí)PyTorch GPU環(huán)境配置:從Anaconda到CUDA兼容性全解析

1. 項(xiàng)目概述:為什么需要一個(gè)“保姆級(jí)”的深度學(xué)習(xí)環(huán)境? 如果你剛拿到一塊新顯卡,或者準(zhǔn)備開始學(xué)習(xí)深度學(xué)習(xí)、計(jì)算機(jī)視覺,那么配置一個(gè)能跑起來的Python環(huán)境,尤其是支持GPU加速的PyTorch環(huán)境,往往是第一道坎…

2026/8/2 4:54:57 閱讀更多
SO加固脫殼實(shí)戰(zhàn):Frida內(nèi)存Dump與ELF結(jié)構(gòu)修復(fù)詳解

SO加固脫殼實(shí)戰(zhàn):Frida內(nèi)存Dump與ELF結(jié)構(gòu)修復(fù)詳解

1. 項(xiàng)目概述:一次完整的SO加固脫殼實(shí)戰(zhàn)在移動(dòng)安全逆向分析領(lǐng)域,遇到加固保護(hù)的SO(共享對(duì)象庫)文件是家常便飯。這些SO文件被廠商通過各種技術(shù)手段(如代碼混淆、加密、虛擬化)保護(hù)起來,直接拖進(jìn)I…

2026/8/2 4:44:56 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來沒有這么容易過! 支持本地語音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來沒有這么容易過! 支持本地語音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/2 2:52:49 閱讀更多