Memoria libre de PHP después de unset

Su pequeño código para la prueba:

$strings = array(' memory usage here is 17.1Mb (checked by pmap) echo memory_get_usage();//0.5Mb //(i know, that other 16.6Mb of memory used by process are php libraries) for($i = 0; $i  memory usage here is 20.3Mb (checked by pmap) echo memory_get_usage();//3.7Mb //so, here its all ok, 17.1+3.2 = 20.3Mb for($i = 0; $i  memory usage here is 20.3Mb (checked by pmap) //BUT?? i UNSET this variables... echo memory_get_usage();//0.5Mb 

Entonces, parece que php no es memoria libre, incluso si unset() su variable. ¿Cómo puedo liberar memoria después de unset?

PHP tiene un recolector de basura que se ocupa de la administración de memoria para usted, lo que afecta el uso de la memoria (del proceso) de diferentes maneras.

En primer lugar, cuando se inspecciona el uso de memoria de un proceso fuera del proceso, incluso si PHP ve que se libera algo de memoria, es posible que no se devuelva al sistema operativo con fines de optimización relacionados con la asignación de memoria. Esto reduce la sobrecarga de las liberaciones y los alocs continuos, que ocurren más fácilmente con los lenguajes GC, ya que el procedimiento de asignación no es visible para el progtwig real.

Por esa razón, incluso si uno llama a gc_collect_cycles() a mano, la memoria puede no liberarse para el sistema operativo, sino reutilizarse para asignaciones futuras. Esto hace que PHP vea un uso de memoria más pequeño que el que utiliza el proceso en realidad, debido a una gran reserva temprana que nunca se libera al sistema operativo.

En segundo lugar, debido a la naturaleza de la recolección de basura, es posible que la memoria no se libere inmediatamente después de que el progtwig marque como no utilizada. Llamar a gc_collect_cycles() liberará la memoria de inmediato, pero debería considerarse innecesaria y no funcionará si tiene una pérdida de memoria lógica (o algo en PHP) en su secuencia de comandos.

Para saber qué está pasando, hacer una inspección línea por línea (por ejemplo, con el seguimiento de funciones de Xdebug) le daría una mejor idea de cómo PHP (o más bien, su progtwig) ve el uso de la memoria.

Combinar eso con la inspección línea por línea desde fuera del proceso (por ejemplo, los comandos pmap ) pmap si el PHP está liberando memoria en algún momento después de reservarla.