GNU/Linux >> Tutoriales Linux >  >> Linux

Force free () para devolver la memoria malloc al sistema operativo

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


Linux
  1. Cómo eliminar búferes de memoria y caché en Linux

  2. Linux:¿determinar correctamente el uso de memoria en Linux?

  3. Linux:¿Linux realiza un "intercambio oportunista" o es un Theth?

  4. ¿Qué devuelve malloc(0)?

  5. Malloc en Linux sin compromisos excesivos

Cómo verificar el uso de memoria en Linux

Comando libre de Linux (Comprobar el uso de la memoria)

Comando libre en Linux

¿Cómo interpretar el uso de memoria superior/htop?

Ejemplos de comandos gratuitos en Linux

Encuentra el tamaño de RAM en Linux