[caracas-pm] Liberar memoria con undef (?)

Luis Muñoz lem at itverx.com.ve
Thu Dec 3 10:39:19 PST 2015


On 3 Dec 2015, at 10:12, Alberto Mijares wrote:

> No dudo que se haya destruido el arreglo (aunque no lo he probado)
> pero ¿por qué no se libera la memoria?

Hay dos factores en juego:

(a) Perl puede haber destruido el arreglo, pero no necesariamente le 
“devolverá” la memoria al sistema usando la llamada free(3)…

(b) … aun haciéndolo, el manejo de memoria de *nix no es capaz de 
reducir la asignación de memoria de un proceso. Esto es, el proceso 
puede crecer pero no reducirse.

La razón para (b) es que en un sistema con memoria virtual — 
esencialmente cualquier sistema contemporáneo — la asignación de 
memoria real vs virtual es arbitraria. Puedes tener un proceso con 
varios Gb de memoria virtual que en realidad, sólo consume pocos Mb de 
memoria real. El recurso escaso es la memoria real, no la virtual.

Las razones para (a) pueden ser un poco más complejas. En general 
tienen que ver con cuánto más rápido puede ser el procesamiento si es 
el propio Perl quien administra su memoria vs malloc(3)/free(3) en el 
sistema anfitrión.

Como regla general, no puedes reducir el tamaño de un proceso. Lo que 
puedes hacer es un fork(), de manera que el hijo haga el cómputo que 
requiere la gran cantidad de memoria, pase el resultado al padre y 
muera. Eso sí permite que la memoria se libere. Alternativamente tal 
vez exista una forma más conservadora en memoria de hacer el trabajo 
que requieres.

Saludos

-lem


More information about the caracas-pm mailing list