"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > PHP: El recolector de basura explicado con palabras simples

PHP: El recolector de basura explicado con palabras simples

Publicado el 2024-12-11
Navegar:566

El recolector de basura (GC) es el sistema de administración de memoria interna en PHP, pero hay algunas sutilezas que deben comprenderse.

? ¿Por qué existe el CG?

El GC automatiza la administración de la memoria, lo que elimina la molestia de manejar la memoria con tareas manuales (lo cual sería tedioso).

Esto permite a los desarrolladores centrarse en su lógica empresarial sin preocuparse excesivamente por los errores de "Memoria insuficiente".

Por supuesto, no es magia.

? 10.000 objetos en resumen

Liberar objetos que ya no son necesarios evita pérdidas de memoria.

El GC utiliza un mecanismo de conteo para determinar los elementos que se eliminarán. Si ninguna referencia apunta a un objeto en particular (es decir, $counter = 0), entonces este objeto es elegible para limpieza.

Funciona bastante bien, pero algunas referencias pueden ser problemáticas:

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);

En este caso de diseño deficiente, PHP no liberará la memoria incluso si desactivamos $a y $b, ya que se hacen referencia entre sí, lo que lleva a PHP a creer que todavía están en uso.

Afortunadamente, existe otro mecanismo llamado Cycle Collector para eso:

gc_collect_cycles();

En términos generales, el recopilador recorre todas las referencias y aplica un algoritmo para marcar los objetos en uso, lo que revela los objetos para recolectar (los que no están marcados).

Sin embargo, PHP no activa la recopilación automática de ciclos hasta que se alcanzan los umbrales de 10,000 objetos con posibles referencias cíclicas.

Nuevamente, no es mágico, por lo que debes invocar gc_collect_cycles() solo en unos pocos casos.

? TANSTAAFL

Un mal diseño puede generar relaciones demasiado complejas entre objetos, lo que genera más referencias y una recolección de basura más frecuente.

Cada objeto contado por referencia requiere almacenamiento adicional para su recuento de referencia.

Fuente: Wikipedia - Recuento de referencias

La sobrecarga asociada con las operaciones de limpieza de memoria puede afectar significativamente el rendimiento global y, en última instancia, aumentar el tiempo de ejecución en escenarios específicos.

Hace 10 años, Composer obtuvo un gran aumento de rendimiento simplemente usando la función gc_disable().

Fuente: Composer - deshabilitar GC

De hecho, PHP 7 mejoró drásticamente el GC, por lo que ya no es lo que era en 2014.

Además, las versiones de PHP 8 mejoraron las estrategias de asignación de memoria y agregaron estadísticas más útiles sobre las operaciones de GC para un mejor monitoreo (gc_status() en 8.3).

La mayoría de las aplicaciones PHP funcionan mediante solicitudes y la memoria se borra automáticamente al final de la solicitud.

Nuevamente, es genial, pero no mágico. ¿Qué sucede con las solicitudes asincrónicas y los objetos/demonios de larga duración?

Es posible que experimentes pérdidas de memoria en algún momento.

? ¿Qué tan diferente es el GC de PHP?

En este punto, es posible que no veas en qué se diferencia el GC de PHP de otros lenguajes.

La mayoría de las veces, otros lenguajes no dependen del recuento de referencias para recolectar basura o pueden usar implementaciones diferentes.

Por ejemplo, muchos utilizan el algoritmo de seguimiento que también marca los objetos no utilizados pero no funciona de forma incremental. Es un recorrido de gráfico.

Además, algunos lenguajes no permiten dicho control directo (por ejemplo, encendido/apagado en tiempo de ejecución).

Como siempre, existen algunas ventajas e inconvenientes, por lo que es posible que veas algunos enfoques híbridos.

?‍? Interactuando con el GC de PHP

Puedes aprovechar los ayudantes gc_* integrados.

Por ejemplo:

  • gc_collect_cycles activa manualmente la recolección de basura
  • gc_status() proporciona el estado actual
  • gc_disable() lo desactiva
  • gc_enable() lo habilita

Estas funciones son útiles para depurar o ajustar la recolección de basura cuando sea necesario.

? Comprender los errores de memoria

Puedes leer esta publicación para obtener más información:

PHP: The Garbage Collector explained with simple words

PHP: errores de memoria

spO0q? ・ 24 de mayo de 23

#php #principiantes #programación

? ¿Mapas débiles al rescate?

PHP 7.4 introdujo referencias débiles y PHP 8 introdujo mapas débiles.

Un mapa débil podría describirse como una colección de referencias débiles.

Esta estructura de datos es un almacén de clave-valor versátil que ayuda a PHP a realizar un seguimiento de los elementos sin crear desorden ni consumir espacio excesivo.

Es posible que lo veas como un almacenamiento temporal que se borrará de inmediato cuando ya no sea necesario, ya que no hay ninguna referencia [fuerte] que pueda impedir la recolección de basura:

$object = new stdClass;
$map = new WeakMap();
$map[$object] = true;
$object->name = 'some name';
print_r($map);// $object is stored in $map

unset($object);

print_r($map);// $object is cleaned and no longer available

✅ Ventajas

  • bastante sencillo
  • ideal para almacenamiento en caché o memorización (por ejemplo, cálculos costosos)

❌ Contras

  • si bien las claves (objetos) no impiden la recolección de basura, los valores sí pueden, por lo que el término "valores arbitrarios" puede ser engañoso (use solo tipos de datos simples como valores)
  • los casos de uso valiosos son limitados

? Optimizar el código

  • aprovechar patrones de diseño que reducen las interdependencias
  • usar inyección de dependencia
  • no cargue conjuntos de datos demasiado grandes en la memoria y utilice colecciones y generadores en lugar de matrices enormes
  • monitorear el uso de memoria
  • perfila tu código con métricas
  • use gc_enable(), gc_disable() y gc_collect_cycles() con moderación

Envolver

Para la mayoría de los usos, no tendrás que preocuparte por la administración de la memoria, ya que PHP ya la maneja.

Sin embargo, debido a que las pilas modernas utilizan objetos de larga duración, es necesario monitorear su aplicación para detectar posibles pérdidas de memoria.

Si tienes problemas, es posible que tengas que optimizar el código y/o interactuar con el GC directamente.

Declaración de liberación Este artículo se reproduce en: https://dev.to/spo0q/php-the-garbage-collector-explained-with-simple-words-1b7d?1 Si hay alguna infracción, comuníquese con [email protected] para eliminar él
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3