La única forma confiable y portátil de que el sistema operativo recupere memoria es salir del proceso. y reinícialo de nuevo, restaurando cualquier estado que necesites para continuar.
Por supuesto, escribir su propia implementación malloc/free usando brk/sbrk según sus necesidades es la otra opción.
Con glibc malloc intenta llamar a malloc_trim
función. No está bien documentado y hubo cambios en su interior alrededor de 2007 (glibc 2.9) - https://stackoverflow.com/a/42281428.
Desde 2007, esta función:Iterará sobre todas las arenas de memoria malloc (utilizadas en aplicaciones de subprocesos múltiples) realizando la consolidación de recorte y fastbin; y libere todas las páginas alineadas (4 KB) completamente liberadas.
https://sourceware.org/git/?p=glibc.git;a=commit;f=malloc/malloc.c;h=68631c8eb92ff38d9da1ae34f6aa048539b199cc
Ulrich Drepperdom, 16 de diciembre de 2007 22:53:08 +0000 (22:53 +0000)
- malloc/malloc.c (public_mTRIm):Iterar sobre todas las arenas y llamar a mTRIm para todas ellas.
(mTRIm):itera adicionalmente sobre todos los bloques libres y usa madvisto memoria libre para todos aquellos bloques que contienen al menos una página de memoria.
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);
Entonces, llamando a malloc_trim
liberará casi toda la memoria liberada al sistema operativo. Sólo se conservarán las páginas que contengan datos aún no liberados; El sistema operativo puede desasignar o no desasignar la página física cuando se le indica con MADV_DONTNEED y Linux generalmente no se desasigna. Las páginas enloquecidas todavía cuentan para VSIZE (tamaño total de memoria virtual del proceso), pero generalmente ayudan a reducir RSS (cantidad de memoria física utilizada por el proceso).
Alternativamente, puede intentar cambiar a la biblioteca malloc alternativa:tcmalloc (gperftools / google-perftools) o jemalloc (facebook), ambos tienen reglas agresivas para devolver la memoria liberada al sistema operativo (con madvise MADV_DONTNEED o incluso MADV_FREE).