RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

轉(zhuǎn)載 golang內(nèi)存分配

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-09-05 14:12 ? 次閱讀

Go 的分配采用了類似 tcmalloc 的結(jié)構(gòu).特點(diǎn): 使用一小塊一小塊的連續(xù)內(nèi)存頁, 進(jìn)行分配某個(gè)范圍大小的內(nèi)存需求. 比如某個(gè)連續(xù) 8KB 專門用于分配 17-24 字節(jié),以此減少內(nèi)存碎片. 線程擁有一定的 cache, 可用于無鎖分配.

同時(shí) Go 對(duì)于 GC 后回收的內(nèi)存頁, 并不是馬上歸還給操作系統(tǒng), 而是會(huì)延遲歸還, 用于滿足未來的內(nèi)存需求.

wKgZombZS7KAXTU0AAWdjb5KQUo739.png

??

在 1.10 以前 go 的堆地址空間是線性連續(xù)擴(kuò)展的, 比如在 1.10(linux amd64)中, 最大可擴(kuò)展到 512GB. 因?yàn)?go 在 gc 的時(shí)候會(huì)根據(jù)拿到的指針地址來判斷是否位于 go 的 heap 的, 以及找到其對(duì)應(yīng)的 span, 其判斷機(jī)制需要 gc heap 是連續(xù)的. 但是連續(xù)擴(kuò)展有個(gè)問題, cgo 中的代碼(尤其是 32 位系統(tǒng)上)可能會(huì)占用未來會(huì)用于 go heap 的內(nèi)存. 這樣在擴(kuò)展 go heap 時(shí), mmap 出現(xiàn)不連續(xù)的地址, 導(dǎo)致運(yùn)行時(shí) throw.

在 1.11 中, 改用了稀疏索引的方式來管理整體的內(nèi)存. 可以超過 512G 內(nèi)存, 也可以允許內(nèi)存空間擴(kuò)展時(shí)不連續(xù).在全局的 mheap struct 中有個(gè) arenas 二階數(shù)組, 在 linux amd64 上,一階只有一個(gè) slot, 二階有 4M 個(gè) slot, 每個(gè) slot 指向一個(gè) heapArena 結(jié)構(gòu), 每個(gè) heapArena 結(jié)構(gòu)可以管理 64M 內(nèi)存, 所以在新的版本中, go 可以管理 4M*64M=256TB 內(nèi)存, 即目前 64 位機(jī)器中 48bit 的尋址總線全部 256TB 內(nèi)存.

wKgZombZS7KAUIgMAAlqCZKg9HA790.png

??

go 的內(nèi)存分配類似于 tcmalloc, 采用了 span 機(jī)制來減少內(nèi)存碎片. 每個(gè) span 管理 8KB 整數(shù)倍的內(nèi)存, 用于分配一定范圍的內(nèi)存需求.

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3019

    瀏覽量

    74003
  • Go
    Go
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    12248
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Golang配置代理方法

    由于一些客觀原因的存在,我們開發(fā) Golang 項(xiàng)目的過程總會(huì)碰到無法下載某些依賴包的問題。這不是一個(gè)小問題,因?yàn)槟愕墓ぷ鲿?huì)被打斷,即便你使用各種神通解決了問題,很可能這時(shí)你的線程已經(jīng)切換到其他的事情上了(痛恨思路被打斷!)。所以最好是一開始我們就重視這個(gè)問題,并一勞永逸的解決它。
    的頭像 發(fā)表于 11-11 11:17 ?208次閱讀
    <b class='flag-5'>Golang</b>配置代理方法

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

    常見的內(nèi)存分配函數(shù)有malloc,mmap等,但大家有沒有想過,這些函數(shù)在內(nèi)核中是怎么實(shí)現(xiàn)的?換句話說,Linux內(nèi)核的內(nèi)存管理是怎么實(shí)現(xiàn)的?
    的頭像 發(fā)表于 09-04 14:28 ?296次閱讀
    <b class='flag-5'>內(nèi)存</b>管理的硬件結(jié)構(gòu)

    如何自定義內(nèi)存控制器的設(shè)置

    在FreeRTOS中自定義內(nèi)存控制器的設(shè)置,主要涉及到內(nèi)存分配策略的選擇和配置。FreeRTOS提供了多種內(nèi)存分配策略,如heap_1、he
    的頭像 發(fā)表于 09-02 14:28 ?456次閱讀

    可以用os_malloc() 分配多少內(nèi)存?有哪些限制?

    我可以用 os_malloc() 分配多少內(nèi)存?有哪些限制?
    發(fā)表于 07-15 06:32

    ESP32S3+LVGL創(chuàng)建一個(gè)界面,請(qǐng)問能只在SPIRAM分配內(nèi)存,IRAM不分配嗎?

    各位前輩好。ESP32S3+LVGL的開發(fā)的過程中發(fā)現(xiàn),創(chuàng)建一個(gè)界面,會(huì)同時(shí)在SPIRAM和IRAM分配相同大小的內(nèi)存。請(qǐng)問能只在SPIRAM分配內(nèi)存,IRAM不
    發(fā)表于 06-06 07:45

    FreeRTOS如何在中斷中調(diào)用內(nèi)存分配函數(shù)?

    最近在玩FreeRTOS,遇到一個(gè)問題,就是不知如何在中斷中調(diào)用內(nèi)存分配函數(shù)。pvPortMalloc函數(shù)中會(huì)調(diào)用xTaskResumeAll,而這個(gè)函數(shù)不能再中斷調(diào)用,所以請(qǐng)問在中斷中進(jìn)行內(nèi)存
    發(fā)表于 05-08 08:25

    使用STVD建一個(gè)STM8的工程,.h文件在哪里添加?內(nèi)存分配函數(shù)是哪個(gè)?

    使用STVD建一個(gè)STM8的工程,.h文件在哪里添加?內(nèi)存分配函數(shù)是哪個(gè)?芯片是怎樣啟動(dòng)的?Source Files 下面的mapping.asmand main.asm 是做什么用的文件?
    發(fā)表于 04-28 09:05

    freertos任務(wù)創(chuàng)建,每一個(gè)任務(wù)分配內(nèi)存是多大才好,怎么計(jì)算呢?

    小白剛剛接觸freertos,想問一下就創(chuàng)建任務(wù)而言,每一個(gè)任務(wù)分配內(nèi)存是多大才好,怎么計(jì)算呢? 另外,每個(gè)任務(wù)的執(zhí)行周期怎么確定?在任務(wù)里面放延時(shí)函數(shù)嗎?
    發(fā)表于 04-23 06:39

    Golang為何舍棄三元運(yùn)算符

    golang中不存在?:運(yùn)算符的原因是因?yàn)檎Z言設(shè)計(jì)者已經(jīng)預(yù)見到三元運(yùn)算符經(jīng)常被用來構(gòu)建一些極其復(fù)雜的表達(dá)式。雖然使用if進(jìn)行替代會(huì)讓代碼顯得更長,但這毫無疑問可讀性更強(qiáng)。
    的頭像 發(fā)表于 04-03 15:13 ?693次閱讀

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因?yàn)闂?b class='flag-5'>內(nèi)存會(huì)自動(dòng)分配和釋放
    發(fā)表于 03-19 11:38 ?521次閱讀
    C語言<b class='flag-5'>內(nèi)存</b>泄漏問題原理

    Linux內(nèi)核內(nèi)存管理之內(nèi)核非連續(xù)物理內(nèi)存分配

    我們已經(jīng)知道,最好將虛擬地址映射到連續(xù)頁幀,從而更好地利用緩存并實(shí)現(xiàn)更低的平均內(nèi)存訪問時(shí)間。然而,如果對(duì)內(nèi)存區(qū)域的請(qǐng)求并不頻繁,那么考慮基于通過連續(xù)線性地址訪問非連續(xù)頁幀的分配方案是有意義的。該模式
    的頭像 發(fā)表于 02-23 09:44 ?944次閱讀
    Linux內(nèi)核<b class='flag-5'>內(nèi)存</b>管理之內(nèi)核非連續(xù)物理<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    Linux內(nèi)核內(nèi)存管理之ZONE內(nèi)存分配

    內(nèi)核中使用ZONE分配器滿足內(nèi)存分配請(qǐng)求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內(nèi)存大小請(qǐng)求。
    的頭像 發(fā)表于 02-21 09:29 ?890次閱讀

    CYT4BF通過分配ITCM內(nèi)存來使用經(jīng)常執(zhí)行的代碼,下載程序時(shí)報(bào)錯(cuò)的原因?

    我正在使用 CYT4BF,我想通過分配 ITCM 內(nèi)存來使用經(jīng)常執(zhí)行的代碼。 SDL 的 tcm 示例中似乎沒有 itcm 示例。 我在 linker_directives.ld 文件中添加
    發(fā)表于 01-31 06:34

    如何使用Golang連接MySQL

    首先我們來看如何使用Golang連接MySQL。
    的頭像 發(fā)表于 01-08 09:42 ?3337次閱讀
    如何使用<b class='flag-5'>Golang</b>連接MySQL

    FreeRTOS內(nèi)存機(jī)制詳解

    FreeRTOS是一種實(shí)時(shí)操作系統(tǒng),它提供了多種內(nèi)存分配方式,包括動(dòng)態(tài)內(nèi)存分配和靜態(tài)內(nèi)存分配。
    的頭像 發(fā)表于 12-31 16:49 ?2681次閱讀
    FreeRTOS<b class='flag-5'>內(nèi)存</b>機(jī)制詳解
    RM新时代网站-首页