2012-12-12 119 views
0

我已經在項目中爲libxml2添加了自定義分配器,並且看到了alloc和free調用的列表。我試圖檢查的是,libxml2如何處理碎片,如果可以的話。程序可執行文件開始增加內存並且不會將其返回到操作系統。有一個libxml2文檔指出,如果操作系統決定返回的內存太小而且重複使用,則可能會發生這種情況。我的程序使用很多小的分配並釋放它們。其他應用程序使用基於線程的內存池,因此不會有泄漏的機會,這些池在處理程序調用的每次迭代中都會重置。我已經使用以下函數來覆蓋默認的分配器來檢查分配。任何幫助理解這可能會有所幫助。我曾嘗試在網站上搜索處理沒有成功的內存碎片。libxml2如何處理碎片

/* the function override the libxml2 default ones **/ 
void cfreeFunc(void* ptr); 
void * cmallocFunc(size_t size); 
void * cmallocAtomicFunc(size_t size); 
void * creallocFunc(void *ptr, size_t size); 
char * cstrdupFunc(const char *str); 

xmlGcMemSetup(cfreeFunc, cmallocFunc, cmallocAtomicFunc, creallocFunc, 
     cstrdupFunc); 

回答

1

的libxml2爲您提供的方法來覆蓋它的內存管理功能 - 什麼,如果沒有這個,做才能解決您的問題?這取決於你的功能方面 - 如果你使用sbrk(或使用sbrk的malloc) - 你永遠不會返回內存。你可以嘗試爲每一次分配使用單獨的mmap,但是如果分配的數量很大,則會顯着增加內存佔用量。更好的方法是使用mmap分配緩衝區,並將它們用作未來分配的內存板。

+0

我的問題是libxml2提供任何種類的構建解決方案,以最大限度地減少碎片。我可以使用重載機制來插入jemalloc或其他分配器,儘可能減少它。在很多項目中使用libxml2可能會有一些內部解決方案。它確實跟蹤分配和內容。 –

+0

爲什麼要這樣?它要求記憶,你的功能給它。然後它要求釋放這些內存。如果_your_ callee函數實際上沒有釋放它 - libxml有什麼問題?最好的辦法是分配大塊,然後將其用於進一步的分配 - 但是,libxml明確地沒有任何關於它需要多少內存的想法,並且它已經給你提供了自己製作的接口。我相信圖書館開發人員不應該爲你的具體情況做出修改,而是爲你提供處理它的界面。 – keltar

+0

他們有我默認的那些功能,如果他們有這種功能的話。他們有一些功能來檢測內存泄漏和覆蓋。反正非常感謝,我欣賞這一點,但這不回答我的問題:(。 –