GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erzwingen Sie free(), um Malloc-Speicher an das Betriebssystem zurückzugeben

Die einzige zuverlässige und tragbare Möglichkeit, Speicher vom Betriebssystem zurückzufordern, besteht darin, den Prozess zu beenden und starten Sie es erneut und stellen Sie jeden Zustand wieder her, den Sie zum Fortfahren benötigen.

Natürlich ist das Schreiben Ihrer eigenen malloc/free-Implementierung mit brk/sbrk entsprechend Ihren Anforderungen die andere Möglichkeit.


Versuchen Sie mit glibc malloc, malloc_trim aufzurufen Funktion. Es ist nicht gut dokumentiert und es gab etwa 2007 (glibc 2.9) Änderungen darin - https://stackoverflow.com/a/42281428.

Seit 2007 wird diese Funktion:Iterieren über alle Malloc-Speicherbereiche (die in Multithread-Anwendungen verwendet werden) und dabei Trimm- und Fastbin-Konsolidierung durchführen; und geben Sie alle ausgerichteten (4 KB) Seiten vollständig frei.

https://sourceware.org/git/?p=glibc.git;a=commit;f=malloc/malloc.c;h=68631c8eb92ff38d9da1ae34f6aa048539b199cc

Ulrich DrepperSo, 16 Dez 2007 22:53:08 +0000 (22:53 +0000)

  • malloc/malloc.c (public_mTRIm):Iteriere über alle Arenen und rufe mTRIm für alle auf.

(mTRIm):Zusätzlich über alle freien Blöcke iterieren und madvise verwenden, um Speicher für alle Blöcke freizugeben, die mindestens eine Speicherseite enthalten.

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

Rufen Sie also malloc_trim auf wird fast den gesamten freigegebenen Speicher wieder an das Betriebssystem freigeben. Nur Seiten mit noch nicht freigegebenen Daten werden aufbewahrt; Das Betriebssystem kann die Zuordnung physischer Seiten aufheben oder nicht aufheben, wenn es mit MADV_DONTNEED konfrontiert wird, und Linux führt dies normalerweise aus. Madvised-Seiten werden immer noch zu VSIZE (Gesamtgröße des virtuellen Speichers des Prozesses) gezählt, helfen aber normalerweise, RSS (Menge des physischen Speichers, der vom Prozess verwendet wird) zu reduzieren.

Alternativ können Sie versuchen, zur alternativen malloc-Bibliothek zu wechseln:tcmalloc (gperftools / google-perftools) oder jemalloc (facebook), beide haben aggressive Regeln, um freigegebenen Speicher an das Betriebssystem zurückzugeben (mit madvise MADV_DONTNEED oder sogar MADV_FREE). P>

Linux
  1. So löschen Sie Speicherpuffer und Cache in Linux

  2. Freier Befehl in Linux mit Beispielen erklärt

  3. Was gibt malloc(0) zurück?

  4. Code für Malloc und kostenlos

  5. Malloc unter Linux ohne Overcommitting

So überprüfen Sie die Speichernutzung in Linux

Linux Free Command (Speichernutzung prüfen)

Kostenloser Befehl unter Linux

Wie wird die Top/htop-Speichernutzung interpretiert?

kostenlose Befehlsbeispiele in Linux

Finden Sie die RAM-Größe in Linux