亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

malloc實現是否會將free-ed內存返回給系統?

malloc實現是否會將free-ed內存返回給系統?

HUWWW 2019-08-08 15:39:56
malloc實現是否會將free-ed內存返回給系統?我有一個長期存在的應用程序,頻繁的內存分配 - 釋放。任何malloc實現都會將釋放的內存返回給系統嗎?在這方面,什么是以下行為:ptmalloc 1,2(默認為glibc)或3dlmalloctcmalloc(谷歌線程malloc)solaris 10-11默認malloc和mtmallocFreeBSD 8默認malloc(jemalloc)Hoard malloc?更新如果我有一個應用程序,其白天和夜晚的內存消耗可能非常不同(例如),我可以強制任何malloc將系統釋放的內存嗎?如果沒有這樣的返回,釋放的內存將被多次換出,但這樣的內存只包含垃圾。
查看完整描述

3 回答

?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

以下分析僅適用于glibc(基于ptmalloc2算法)。某些選項似乎有助于將釋放的內存返回給系統:

  1. mallopt()(定義malloc.h)確實提供了一個使用參數選項之一設置修剪閾值的選項M_TRIM_THRESHOLD,這表示數據段頂部允許的最小可用內存量(以字節為單位)。如果數量低于此閾值,glibc將調用brk()以將內存返回給內核。

    M_TRIM_THRESHOLDLinux中的默認值設置為128K,設置較小的值可能會節省空間。

    通過在環境變量中設置修剪閾值可以實現相同的行為MALLOC_TRIM_THRESHOLD_,絕對沒有源更改。

    但是,使用的初步測試程序M_TRIM_THRESHOLD已經表明,即使malloc分配的內存確實返回系統,最初請求的實際內存塊(競技場)的剩余部分brk()也會被保留。

  2. 可以通過調用malloc_trim(pad)(定義malloc.h)來修剪內存區域并將任何未使用的內存返回給系統。此函數調整數據段的大小,pad在其末尾至少留下字節,如果可以釋放少于一頁的字節,則失敗。段大小始終是一頁的倍數,在i386上為4,096字節。

    可以使用malloc鉤子功能來完成這種修改的free()使用行為的malloc_trim實現。這不需要對核心glibc庫進行任何源代碼更改。

  3. madvise()在glibc的免費實現中使用系統調用。



查看完整回答
反對 回復 2019-08-08
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

我正在處理與OP相同的問題。到目前為止,似乎有可能使用tcmalloc。我找到了兩個解決方案

  1. 編譯你的程序與tcmalloc鏈接,然后啟動它:

    env TCMALLOC_RELEASE=100 ./my_pthread_soft

    文件中提到了這一點

    合理的費率在[0,10]范圍內。

    但是10對我來說似乎不夠(也就是說我看不到變化)。

  2. 在代碼中找到釋放所有釋放內存的有趣內容,然后添加以下代碼:

    #include "google/malloc_extension_c.h" // C include#include "google/malloc_extension.h"   // C++ include/* ... */MallocExtension_ReleaseFreeMemory();

在我的情況下,第二種解決方案非常有效; 第一個會很棒,但不是很成功,例如找到正確的數字很復雜。


查看完整回答
反對 回復 2019-08-08
  • 3 回答
  • 0 關注
  • 853 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號