Instruções de implementação
1. Adicione um contador de referência ao objeto. O valor do contador de referência aumentará a cada vez em algum lugar. Sempre que uma referência se torna inválida, o contador é decrementado em um.
Se a refcount do valor da variável for reduzida em um e for igual a 0, o valor será liberado e não será lixo. O coletor de lixo não lida com isso.
Se a refcount do valor da variável for maior que 0 após ser reduzida em um, o valor é considerado não liberável e pode se tornar lixo.
2. O coletor de lixo coleta o lixo possível. Após atingir uma determinada quantidade, ele inicia o programa de identificação do lixo e libera o lixo real.
Exemplo
<?php // Caso do mecanismo de coleta de lixo do PHP: consulte o manual do php //--------------------Tipo escalar-------------------- // dica: Cada variável PHP existe em um contêiner de variáveis chamado "zval", que contém o tipo e o valor da variável, "is_ref": se é uma variável de referência, "refcount": contagem de referência // ex: Gere um novo contêiner zval $a = 'nova string'; // ex: exibe informações do contêiner zval xdebug_debug_zval('a'); // a: (refcount=1, is_ref=0),string 'new string' (length=10) // ex: Aumenta a contagem de referência do contêiner zval $c = $b = $a; xdebug_debug_zval('a'); // a:(refcount=3, is_ref=0),string 'nova string' (comprimento=10) xdebug_debug_zval('b'); // b:(refcount=3, is_ref=0),string 'nova string' (comprimento=10) xdebug_debug_zval('c'); // c:(refcount=3, is_ref=0),string 'nova string' (comprimento=10) // dica: Só existe um container neste momento, pois o PHP não irá copiar a variável container gerada quando não for necessário // Neste momento, este container variável está associado à variável a, variável b e variável c. unset($b); // ex: reduz a contagem de referência xdebug_debug_zval('a'); // a:(refcount=2, is_ref=0),string 'new string' (length=10) // dica: unset Ao excluir uma variável, a contagem da variável refcount é decrementada em um. Neste momento, apenas $a e $b apontam para o contêiner da variável. não definido($a); não definido($c); var_dump($a); // dica: Neste momento, a recontagem é 0 e a variável é deletada // Quando a recontagem se torna 0, o contêiner da variável que contém o tipo e o valor será deletado da memória. //--------------------Tipo composto------------- echo '-------------Tipo composto-----------<br/>'; $a = matriz( 'nome' => 'júnior', 'idade' => 18 ); xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // matriz (tamanho=2) // 'nome' => (refcount=1, is_ref=0),string 'junior' (comprimento=6) // 'idade' => (refcount=1, is_ref=0),int 18 // ex: Adicionar um elemento existente ao array $a['love'] = $a['name']; xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // matriz (tamanho=3) // 'nome' => (refcount=2, is_ref=0),string 'junior' (comprimento=6) // 'idade' => (refcount=1, is_ref=0),int 18 // 'amor' => (refcount=2, is_ref=0),string 'junior' (comprimento=6) // $a = array('um'); // xdebug_debug_zval('a'); // // $b = &$a; // $c = $a; // $b = &$c; // xdebug_debug_zval('b'); // xdebug_debug_zval('c'); // xdebug_debug_zval('a'); // Limpa o problema do contêiner de variáveis echo '-----------Problema de vazamento de memória-----------<br/>'; $a = array('um'); xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // matriz (tamanho=1) // 0 => (refcount=1, is_ref=0),string 'um' (comprimento=3) $a[] = &$a; xdebug_debug_zval('a'); // a:(refcount=2, is_ref=1), // matriz (tamanho=2) // 0 => (refcount=1, is_ref=0),string 'um' (comprimento=3) // 1 => (refcount=2, is_ref=1), // &variedade //desconfigurado($a); // (refcount=1, is_ref=1)=array ( // 0 => (refcount=1, is_ref=0)='one', // 1 => (refcount=1, is_ref=1)=... // ) // dica: Após unset($a), a contagem de referências é decrementada em um, mesmo que não haja mais nenhum símbolo em um escopo apontando para esta estrutura (ou seja, o contêiner da variável), // Como o elemento "1" do array ainda aponta para o próprio array, este contêiner não pode ser limpo // Como não há outro símbolo apontando para ele, o usuário não tem como limpar esta estrutura, resultando em um vazamento de memória // Felizmente , PHP irá Essa estrutura de dados será limpa no final da execução do script, mas muita memória será consumida antes que o PHP a limpe. // A mesma coisa acontece com objetos, na verdade é mais provável que aconteça com objetos porque os objetos são sempre referenciados implicitamente.
O texto acima mostra como a contagem de referências do PHP implementa a coleta de lixo. Espero que seja útil para todos.