Pregunta

Mi aplicación similar al programa hipotético:

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

No tiene pérdidas de memoria, pero en mi sistema, el consumo de memoria (arriba, columna VSS) crece sin límites (como el 300% de la memoria física disponible). ¿Es esto normal?

Actualizado : utiliza la memoria por un tiempo y luego libérala. ¿Esto es una diferencia?

¿Fue útil?

Solución

Intenta añadir

  sbrk(-1);

al final de cada bucle para ver si hace la diferencia.

El free () solo desasigna la memoria pero no la devuelve al sistema operativo.

Otros consejos

El comportamiento es normal. Citando man 3 malloc :

ERRORES

Por defecto, Linux sigue una estrategia optimista de asignación de memoria. Esto significa que cuando malloc () devuelve non-NULL, no hay garantía de que el        La memoria realmente está disponible. Este es un error muy malo. En caso de que el sistema se quede sin memoria, uno o más procesos serán        asesinado por el infame asesino de OOM. En caso de que Linux se emplee en circunstancias en las que sería menos deseable perder repentinamente algo al azar        Los procesos seleccionados y, además, la versión del kernel es lo suficientemente reciente, se puede desactivar este comportamiento de sobrecompromiso con un comando como:

       # echo 2 > /proc/sys/vm/overcommit_memory

Consulte también el directorio de documentación del kernel, archivos vm / overcommit-accounting y sysctl / vm.txt.

Necesitas tocar (leer / escribir) la memoria del kernel de Linux para reservarla.

El sistema operativo generalmente asigna todas las páginas como clones de Copia en escritura de " 0 " Página, que es una página fija llena de ceros. Leyendo de las paginas devolverá 0 como se esperaba. Mientras solo leas, todas las referencias van La misma memoria física. Una vez que escribe un valor, el " COW " es roto y un marco de página real, físico, se asigna para usted. Esta significa que mientras no escribas en la memoria puedes guardar asignar memoria hasta que el espacio de direcciones de la memoria virtual se agote o la tabla de tu página llena toda la memoria disponible.

Mientras no toque esos fragmentos asignados, el sistema realmente no los asignará por usted.
Sin embargo, puede quedarse sin espacio direccionable, que es un límite que el sistema operativo impone a los procesos, y no es necesariamente el máximo que puede abordar con el tipo de puntero del sistema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top