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>