Le seul moyen fiable et portable pour que le système d'exploitation récupère de la mémoire est de quitter le processus et redémarrez-le à nouveau, en restaurant tout état dont vous avez besoin pour continuer.
Bien sûr, écrire votre propre implémentation malloc/free en utilisant brk/sbrk selon vos besoins est l'autre option.
Avec glibc malloc essayez d'appeler malloc_trim
fonction. Il n'est pas bien documenté et il y a eu des changements à l'intérieur vers 2007 (glibc 2.9) - https://stackoverflow.com/a/42281428.
Depuis 2007, cette fonction va :Itérer sur toutes les arènes de mémoire malloc (utilisées dans les applications multithread) en réalisant une consolidation trim et fastbin; et libérer toutes les pages alignées (4 Ko) entièrement libérées.
https://sourceware.org/git/?p=glibc.git;a=commit;f=malloc/malloc.c;h=68631c8eb92ff38d9da1ae34f6aa048539b199cc
Ulrich DrepperDim 16 décembre 2007 22:53:08 +0000 (22:53 +0000)
- malloc/malloc.c (public_mTRIm) :Itérer sur toutes les arènes et appeler mTRIm pour chacune d'entre elles.
(mTRIm) :parcourez en outre tous les blocs libres et utilisez madvise pour libérer de la mémoire pour tous les blocs contenant au moins une page de mémoire.
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);
Alors, appelez le malloc_trim
libérera presque toute la mémoire libérée vers le système d'exploitation. Seules les pages contenant des données non encore libérées seront conservées; Le système d'exploitation peut démapper ou non la page physique lorsqu'il est conseillé avec MADV_DONTNEED et Linux le fait généralement. Les pages madvisées comptent toujours pour VSIZE (taille totale de la mémoire virtuelle du processus), mais aident généralement à réduire le RSS (quantité de mémoire physique utilisée par le processus).
Alternativement, vous pouvez essayer de basculer vers une bibliothèque malloc alternative :tcmalloc (gperftools / google-perftools) ou jemalloc (facebook), les deux ont des règles agressives de retour de la mémoire libérée vers le système d'exploitation (avec madvise MADV_DONTNEED ou même MADV_FREE).