Jediným spolehlivým a přenosným způsobem, jak získat zpět paměť operačního systému, je ukončit proces a znovu jej restartujte, čímž obnovíte jakýkoli stav, který potřebujete k pokračování.
Druhou možností je samozřejmě napsat si vlastní implementaci malloc/free pomocí brk/sbrk podle vašich potřeb.
Pomocí glibc malloc zkuste zavolat malloc_trim
funkce. Není dobře zdokumentován a kolem roku 2007 v něm došlo ke změnám (glibc 2.9) - https://stackoverflow.com/a/42281428.
Od roku 2007 bude tato funkce:Iterovat přes všechny arény paměti malloc (používané ve vícevláknových aplikacích) a provádět konsolidaci trim a fastbin; a uvolněte všechny zarovnané (4KB) stránky zcela uvolněné.
https://sourceware.org/git/?p=glibc.git;a=commit;f=malloc/malloc.c;h=68631c8eb92ff38d9da1ae34f6aa048539b199cc
Ulrich DrepperSun, 16. prosince 2007 22:53:08 +0000 (22:53 +0000)
- malloc/malloc.c (public_mTRIm):Iterujte všechny arény a volejte mTRIm pro všechny z nich.
(mTRIm):Navíc iterujte přes všechny volné bloky a použijte madviseto k uvolnění paměti pro všechny ty bloky, které obsahují alespoň jednu stránku paměti.
https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=malloc/malloc.c;h=c54c203cbf1f024e72493546221305b4fd5729b7;hp=1e716089a2b976d120c304ad75dd95c63737ad75;hb=68631c8eb92ff38d9da1ae34f6aa048539b199cc;hpb=52386be756e113f20502f181d780aecc38cbb66a
+ malloc_consolidate (av);
...
+ for (int i = 1; i < NBINS; ++i)
...
+ for (mchunkptr p = last (bin); p != bin; p = p->bk)
+ {
...
+ /* See whether the chunk contains at least one unused page. */
+ char *paligned_mem = (char *) (((uintptr_t) p
+ + sizeof (struct malloc_chunk)
+ + psm1) & ~psm1);
...
+ /* This is the size we could potentially free. */
+ size -= paligned_mem - (char *) p;
+
+ if (size > psm1)
+ {
...
+ madvise (paligned_mem, size & ~psm1, MADV_DONTNEED);
Volání malloc_trim
uvolní téměř veškerou uvolněnou paměť zpět do operačního systému. Budou zachovány pouze stránky obsahující dosud neuvolněná data; OS může odmapovat nebo nezmapovat fyzickou stránku, když je doporučeno MADV_DONTNEED a linux obvykle odmapuje. madvised stránky se stále počítají do VSIZE (celková velikost virtuální paměti procesu), ale obvykle pomáhají snížit RSS (množství fyzické paměti používané procesem).
Případně můžete zkusit přejít na alternativní knihovnu malloc:tcmalloc (gperftools / google-perftools) nebo jemalloc (facebook), obě mají agresivní pravidla vracení uvolněné paměti zpět do OS (s madvise MADV_DONTNEED nebo dokonce MADV_FREE).