Perl gestiona la memoria automáticamente: las variables se destruyen cuando ya no hay referencias a ellas (conteo de referencias). El recolector de basura en Perl no utiliza un típico GC por trazado, sino que se basa en el conteo de referencias.
Ventajas:
free(), como en C).Desventajas y problemas:
my $a = {}; my $b = {}; $a->{b} = $b; $b->{a} = $a; # Ambas variables no se liberan en la limpieza, perl no puede eliminarlas
Para resolver problemas como este, se utiliza el módulo Scalar::Util::weaken, que permite "debilitar" una referencia:
use Scalar::Util 'weaken'; my $a = {}; my $b = {}; $a->{b} = $b; weaken($b->{a} = $a);
¿Se eliminan todos los objetos de Perl al eliminar todas las variables explícitas que apuntan a ellos, incluso si hay referencias entre ellos?
Respuesta: ¡No! Si los objetos se refieren entre sí (creando un ciclo), Perl no los eliminará: será necesario romper el ciclo manualmente o debilitar la referencia a través de Scalar::Util::weaken.
Historia
Al desarrollar un demonio de larga duración que maneja una gran cantidad de conexiones, los programadores no notaron una referencia cíclica entre el objeto IoHandle y el manejador de eventos asociado. Después de unas horas de operación, la memoria crecía exponencialmente: solo un análisis con Devel::Leak reveló el problema.
Historia
En el proceso ETL de parsing de grandes archivos, la acumulación de millones de elementos temporales en un hash causaba "congelamiento" del proceso incluso después de que el ciclo terminara. Esto sucedió porque uno de los elementos guardaba una referencia anidada al padre (para relaciones de tres niveles) y no se liberaba memoria. Una reestructuración parcial del esquema ayudó a evitar la filtración.
Historia
Los programadores usaron cierres en el motor de MapReduce, manteniendo copias del contexto en subprogramas anónimos. Estos subprogramas "filtraban": la memoria no se liberaba incluso después de que terminara la tarea por lotes, ya que el contexto contenía referencias a sí mismo. Se añadió un
undefexplícito para asegurar la eliminación correcta.