GNU/Linux >> Tutoriels Linux >  >> Linux

Forcer free() à renvoyer la mémoire malloc au système d'exploitation

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).


Linux
  1. Linux - Détermination correcte de l'utilisation de la mémoire sous Linux ?

  2. Linux - Linux effectue-t-il un "échange opportuniste", ou est-ce un Theth ?

  3. Commande gratuite sous Linux expliquée avec des exemples

  4. Comment enregistrer la consommation de mémoire sous Linux ?

  5. Quelle commande peut être utilisée pour forcer la libération de tout dans la partition d'échange en mémoire ?

Comment vérifier l'utilisation de la mémoire sous Linux

Commande gratuite Linux (vérifier l'utilisation de la mémoire)

Commande gratuite sous Linux

Comment interpréter l'utilisation de la mémoire Top/htop ?

exemples de commandes gratuits sous Linux

Trouver la taille de la RAM sous Linux