簡體   English   中英

如何通過固定的字節數增加每個內存分配大小會影響堆碎片?

[英]How will increasing each memory allocation size by a fixed number of bytes affect heap fragmentation?

我在我的C ++程序中替換了operator new() ,因此它分配了一個稍大的塊來存儲額外的數據 因此,程序執行完全相同的分配集,但現在它在每次分配中請求多個字節的內存。 否則它的行為完全相同,它處理完全相同的數據。 該程序在運行時分配了許多不同大小的塊(數百萬,我猜)。

如何將每個分配大小增加固定的字節數(每個分配都相同)會影響堆碎片?

除非你的程序使用一些“邊緣”塊大小(比如接近2的冪),否則我看不到塊大小(或塊大小與標准分配的程序相比的小差異)可能會影響碎片。 有了數百萬的分配,一個好的分配器可以填補空間並有效地管理它。

相反地​​想一想,假設您的程序最初使用的塊大小與修改后的分配器相同。 在那種情況下你會打擾內存碎片嗎?

如果你的塊(已分配和釋放的內存)仍然較小,那么C庫分配器處理沒有碎片問題,你不能面對任何內存碎片。 例如,看看我自己關於分配器的問題: Linux(或RedHat Linux)上的小塊分配器,以避免內存碎片

換一種說法。 你已經實現了自己的:: operator new(),並在其中調用malloc()並傳遞一個更大的塊大小。 malloc()位於C庫中,它不僅負責分配和解除分配,還負責避免內存碎片。 如果你不經常分配和釋放大小超過分配器的塊可以有效處理,那么你可以預期會有內存碎片。

堆通常實現為單元的鏈接列表。 在應用程序啟動時,只有一個大型單元。 您的第一個分配在開始時中斷了一小部分以創建新的已分配堆單元。 后續分配也是如此。 過了一會兒,一些細胞被釋放,在分配的塊之間留下了自由孔。

運行一段時間后,當您請求分配時,分配器會遍歷堆,直到找到與請求的大小相同或更大的空閑單元。 向上舍入到更大的單元分配大小可能需要更多的內存,但增加了找到合適的空閑單元的可能性,這意味着不必將新內存添加到堆的末尾。 這可以提高性能。

但是,請記住堆操作很昂貴,因此應盡量減少。 您最有可能分配和釋放相同類型的對象,因此大小相同。 考慮為您的對象使用專門的免費列表。 這將保存堆操作,從而最大限度地減少碎片。 由於這個原因,STL有分配器。

這取決於驅動內存分配器的實現,例如:在寡婦身上,它從進程堆中提取內存,在XP下,這個堆沒有設置為低碎片實現,這可能真正引發了一個扳手。

在基於bin或slab的分配器下,你的幾個額外字節可能會將它推到下一個塊大小,瘋狂浪費內存並導致可怕的虛擬內存抖動。

根據您的內存使用需求,使用自定義allacator替換::new可能會更好,例如hoard或nedmalloc。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM