Red de conocimiento informático - Programación de la red - Analizar si desarmar en PHP liberará memoria

Analizar si desarmar en PHP liberará memoria

¿Unset en PHP liberará memoria? Ilustrémoslo con un ejemplo a continuación.

Primero, veamos un ejemplo y copiemos el código de la siguiente manera: var_dump(memory_get_usage()); $ a = "laruence"; var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());

Salida (en mi computadora personal puede estar cargada debido a la versión PHP del sistema). Diferentes extensiones): int() int() int(

Nota = Entonces hay varias conclusiones. Algunas personas dicen que PHP desarmado en realidad no libera memoria, y algunos dicen que PHP desarmado Solo cuando variables grandes ( Si se libera una gran cantidad de cadenas y matrices grandes, ¿la memoria estará realmente libre? Algunas personas incluso dicen que hablar de memoria a nivel de PHP no tiene sentido

Entonces, ¿unset liberará memoria? ¿A dónde fue? Para responder a esta pregunta, comenzaré con dos aspectos: ¿A dónde fue este byte? Primero, tenemos que romper con un pensamiento: PHP no es como el lenguaje C, solo cuando llame explícitamente a la API relacionada con la asignación de memoria habrá asignación. significa que hay muchos procesos de asignación de memoria en PHP que no podemos ver. Por ejemplo: Copie el código de la siguiente manera: $a = "laruence"

El punto de asignación de memoria implícito es: para variables Nombre de la memoria asignada; se almacena en la tabla de símbolos para asignar valores de variables, por lo que no puede simplemente mirar la apariencia. En segundo lugar, no dude que el desarmado de PHP liberará la memoria (por supuesto, también debe combinarse con referencia y conteo. Consulte mi artículo anterior para comprender los principios de PHP en profundidad (separación de variables/referencia). Pero esta versión no es una versión en el sentido de la programación en C y no se devuelve al sistema operativo. Para PHP, proporciona un conjunto de memoria. API de administración similares al lenguaje C para la asignación de memoria. Estas API corresponden al significado de las API de C. Dentro de PHP, la memoria se administra a través de estas API.

Cuando llamamos a emalloc para aplicar. Para la memoria, PHP no simplemente solicita memoria al sistema operativo, sino que luego se le asigna un gran bloque de memoria al solicitante, de modo que cuando hay lógica para solicitar memoria, no hay necesidad de solicitar memoria. desde el SO y se evitan llamadas frecuentes al sistema, como el siguiente ejemplo: Copie el código y el código es el siguiente: lt; ?php var_dump(memory_get_usage(TRUE) //Tenga en cuenta que lo que se obtiene es real_size $a = "laruence"; var_dump(memory_get_usage(TRUE)); unset($a); var_dump(memory_get_usage(TRUE));

Salida: int() int() int(

Es decir, cuando definimos la variable $a, PHP no aplica para nueva memoria del sistema

Lo mismo ocurre cuando llamamos Cuando efree libera la memoria, PHP no devolverá la memoria al sistema operativo , pero colocará la memoria en la lista de memoria libre que él mismo mantiene. Para piezas pequeñas de memoria, es más probable que la coloque en la lista de memoria caché (posdata. Algunas versiones de PHP, como el PHP que he verificado, no lo hacen). reste el tamaño del bloque de memoria disponible en la lista de memoria caché al llamar a get_memory_usage(), lo que hace que aparezca sin configurar.

La memoria permanece sin cambios después de eso)

Ahora déjame responder a dónde fue este byte. Como acabo de decir, muchos procesos de asignación de memoria no son explícitos. Lo entenderás después de leer el siguiente código: Copiar El código es como. sigue: lt;?php var_dump("Soy jb net"); var_dump(memory_get_usage()); $a = "laruence"; var_dump(memory_get_usage());

Salida: string() "Soy jb net" int() //int() antes de la asignación int() //Sí, la memoria se libera normalmente

= Normal En otras palabras, este byte está ocupado por la función de salida (estrictamente hablando, está ocupado por el encabezado de salida). La matriz Hashtable, que solo aumenta pero no disminuye, es la estructura central de PHP (para aprender sobre Hashtable, usted). Puede consultar mi artículo anterior para comprender en profundidad PHP. Matriz (orden transversal)) Las matrices también están representadas por ella, y la tabla de símbolos también es una matriz asociativa. Para el siguiente código: copie el código de la siguiente manera: var_dump. ("Soy jb net"); var_dump(memory_get_usage()); $array = array_fill( "laruence"); foreach ($array as $key =gt; $value) { ${$value $key} = NULL; } var_dump(memory_get_usage()); foreach ($array as $key=gt; $ value) { unset(${$value $key}); var_dump(memory_get_usage()); una variable y luego hizo clic en Desarmar para ver el resultado: string() " Soy jb net" int() int() int(

Vaya, ¿por qué hay tanta menos memoria? Esto se debe a que es Es imposible que Hashtable asigne suficientes bloques de memoria a la vez al definirlo. Para guardar una cantidad desconocida de elementos, PHP solo asignará una pequeña parte del bloque de memoria a HashTable durante la inicialización. Cuando no sea suficiente, RESTAURARÁ para expandirse. la capacidad

Sin embargo, la tabla Hash solo se puede expandir y no se reducirá. Para el ejemplo anterior, cuando almacenamos una variable, la tabla de símbolos no fue suficiente y la expandimos cuando desarmetamos la variable. a su vez, la memoria ocupada por la variable se liberó (-) pero la tabla de símbolos no se redujo, por lo que la tabla de símbolos utilizó la pequeña memoria. Ocupa... lishixinzhi/Article/program/PHP/201311/21152.