3 回答

TA貢獻1891條經驗 獲得超3個贊
以下分析僅適用于glibc(基于ptmalloc2算法)。某些選項似乎有助于將釋放的內存返回給系統:
mallopt()(定義
malloc.h
)確實提供了一個使用參數選項之一設置修剪閾值的選項M_TRIM_THRESHOLD
,這表示數據段頂部允許的最小可用內存量(以字節為單位)。如果數量低于此閾值,glibc將調用brk()
以將內存返回給內核。M_TRIM_THRESHOLD
Linux中的默認值設置為128K,設置較小的值可能會節省空間。通過在環境變量中設置修剪閾值可以實現相同的行為
MALLOC_TRIM_THRESHOLD_
,絕對沒有源更改。但是,使用的初步測試程序
M_TRIM_THRESHOLD
已經表明,即使malloc分配的內存確實返回系統,最初請求的實際內存塊(競技場)的剩余部分brk()
也會被保留。可以通過調用
malloc_trim(pad)
(定義malloc.h
)來修剪內存區域并將任何未使用的內存返回給系統。此函數調整數據段的大小,pad
在其末尾至少留下字節,如果可以釋放少于一頁的字節,則失敗。段大小始終是一頁的倍數,在i386上為4,096字節。可以使用malloc鉤子功能來完成這種修改的
free()
使用行為的malloc_trim
實現。這不需要對核心glibc庫進行任何源代碼更改。madvise()
在glibc的免費實現中使用系統調用。

TA貢獻1805條經驗 獲得超9個贊
我正在處理與OP相同的問題。到目前為止,似乎有可能使用tcmalloc。我找到了兩個解決方案
編譯你的程序與tcmalloc鏈接,然后啟動它:
env TCMALLOC_RELEASE=100 ./my_pthread_soft
文件中提到了這一點
合理的費率在[0,10]范圍內。
但是10對我來說似乎不夠(也就是說我看不到變化)。
在代碼中找到釋放所有釋放內存的有趣內容,然后添加以下代碼:
#include "google/malloc_extension_c.h" // C include#include "google/malloc_extension.h" // C++ include/* ... */MallocExtension_ReleaseFreeMemory();
在我的情況下,第二種解決方案非常有效; 第一個會很棒,但不是很成功,例如找到正確的數字很復雜。
添加回答
舉報