作者:錢文
Go 的分配采用了類似 tcmalloc 的結(jié)構(gòu).特點(diǎn): 使用一小塊一小塊的連續(xù)內(nèi)存頁, 進(jìn)行分配某個范圍大小的內(nèi)存需求. 比如某個連續(xù) 8KB 專門用于分配 17-24 字節(jié),以此減少內(nèi)存碎片. 線程擁有一定的 cache, 可用于無鎖分配.
同時 Go 對于 GC 后回收的內(nèi)存頁, 并不是馬上歸還給操作系統(tǒng), 而是會延遲歸還, 用于滿足未來的內(nèi)存需求.
??
在 1.10 以前 go 的堆地址空間是線性連續(xù)擴(kuò)展的, 比如在 1.10(linux amd64)中, 最大可擴(kuò)展到 512GB. 因?yàn)?go 在 gc 的時候會根據(jù)拿到的指針地址來判斷是否位于 go 的 heap 的, 以及找到其對應(yīng)的 span, 其判斷機(jī)制需要 gc heap 是連續(xù)的. 但是連續(xù)擴(kuò)展有個問題, cgo 中的代碼(尤其是 32 位系統(tǒng)上)可能會占用未來會用于 go heap 的內(nèi)存. 這樣在擴(kuò)展 go heap 時, mmap 出現(xiàn)不連續(xù)的地址, 導(dǎo)致運(yùn)行時 throw.
在 1.11 中, 改用了稀疏索引的方式來管理整體的內(nèi)存. 可以超過 512G 內(nèi)存, 也可以允許內(nèi)存空間擴(kuò)展時不連續(xù).在全局的 mheap struct 中有個 arenas 二階數(shù)組, 在 linux amd64 上,一階只有一個 slot, 二階有 4M 個 slot, 每個 slot 指向一個 heapArena 結(jié)構(gòu), 每個 heapArena 結(jié)構(gòu)可以管理 64M 內(nèi)存, 所以在新的版本中, go 可以管理 4M*64M=256TB 內(nèi)存, 即目前 64 位機(jī)器中 48bit 的尋址總線全部 256TB 內(nèi)存.
??
go 的內(nèi)存分配類似于 tcmalloc, 采用了 span 機(jī)制來減少內(nèi)存碎片. 每個 span 管理 8KB 整數(shù)倍的內(nèi)存, 用于分配一定范圍的內(nèi)存需求.
審核編輯 黃宇
-
內(nèi)存分配
+關(guān)注
關(guān)注
0文章
17瀏覽量
8439
發(fā)布評論請先 登錄
如何使用LAX_CODEGEN啟用動態(tài)內(nèi)存分配?
如何查看S32DS中S32平臺的內(nèi)存分配?
快速搞懂C語言程序內(nèi)存分區(qū)!

hyper v 內(nèi)存,hyper v 內(nèi)存設(shè)置的操作步驟和方法是什么?

信道分配算法在通信中的應(yīng)用
虛擬內(nèi)存不足如何解決 虛擬內(nèi)存和物理內(nèi)存的區(qū)別
Golang配置代理方法

AIC3262的系數(shù)內(nèi)存溢出怎么解決?
邏輯內(nèi)存和物理內(nèi)存的區(qū)別
【米爾NXP i.MX 93開發(fā)板試用評測】4、使用golang搭建Modbus 服務(wù)器
轉(zhuǎn)載 golang內(nèi)存分配

內(nèi)存管理的硬件結(jié)構(gòu)

如何自定義內(nèi)存控制器的設(shè)置
堆棧和內(nèi)存的基本知識

評論