記憶體不是完全隨機讀寫嘛,和機械硬碟是不同的實體介質,那麼記憶體中是否有記憶體碎片為什麼還會影響效能呢?這個記憶體碎片到底是指什麼
內存分配器一般是預先向OS申請一大段內存,然後每次 malloc()時標記一小段為已分配,free()這一小段時再標成未分配。
malloc()
free()
malloc/free的順序一般是任意的,那麼在多次malloc/free後分配和未分配會交替存在,如分配1 -- 未分配1 -- 分配2 -- 未分配2,即未分配記憶體是一個個"碎片"。
分配1 -- 未分配1 -- 分配2 -- 未分配2
記憶體碎片的壞處:
額外佔用內存: 即使未分配總量足夠,仍然可能分不出連續內存,此時需要向OS申請更多
影響cache: cache是以頁為單位的,一頁中的未分配部分一樣要佔用cache
最好的方法就是不用系統的預設進程堆。而是自己申請一個新的記憶體堆。一類的資料放在一個堆裡。這適合頻繁申請和釋放的小段數據。 也可以是自己先malloc一大塊數據,再用自己的記憶體池來管理。 前一種,Windows的檔案管理器Explore有這麼用。例如遍歷的目錄樹結構,就是放在單獨的堆裡,一次HeapFree釋放整個堆,而不需要一次次把葉子節點釋放了。 第二種,例如libjpeg本身就是有一個專門的記憶體池。
可以了解一下buddy algorithm
還有這個PDF
打不開就翻牆哦
想了解下malloc實作就去看看dlmalloc的源碼哦,不複雜
malloc
dlmalloc
內存分配器一般是預先向OS申請一大段內存,然後每次
malloc()
時標記一小段為已分配,free()
這一小段時再標成未分配。malloc/free的順序一般是任意的,那麼在多次malloc/free後分配和未分配會交替存在,如
分配1 -- 未分配1 -- 分配2 -- 未分配2
,即未分配記憶體是一個個"碎片"。記憶體碎片的壞處:
額外佔用內存: 即使未分配總量足夠,仍然可能分不出連續內存,此時需要向OS申請更多
影響cache: cache是以頁為單位的,一頁中的未分配部分一樣要佔用cache
最好的方法就是不用系統的預設進程堆。而是自己申請一個新的記憶體堆。一類的資料放在一個堆裡。這適合頻繁申請和釋放的小段數據。
也可以是自己先malloc一大塊數據,再用自己的記憶體池來管理。
前一種,Windows的檔案管理器Explore有這麼用。例如遍歷的目錄樹結構,就是放在單獨的堆裡,一次HeapFree釋放整個堆,而不需要一次次把葉子節點釋放了。
第二種,例如libjpeg本身就是有一個專門的記憶體池。
可以了解一下buddy algorithm
還有這個PDF
打不開就翻牆哦
想了解下
malloc
實作就去看看dlmalloc
的源碼哦,不複雜