
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.