O Garbage Collector (GC) é o sistema de gerenciamento de memória interna em PHP, mas há algumas sutilezas para entender.
O GC automatiza o gerenciamento de memória, o que elimina o incômodo de lidar com a memória com tarefas manuais (o que seria tedioso).
Isso permite que os desenvolvedores se concentrem em sua lógica de negócios sem se preocupar excessivamente com erros de 'Falta de memória'.
Claro, não é mágica.
Liberar objetos que não são mais necessários evita vazamentos de memória.
O GC usa um mecanismo de contagem para determinar os elementos a serem descartados. Se nenhuma referência apontar para um objeto específico (ou seja, $counter = 0), então este objeto é elegível para limpeza.
Funciona muito bem, mas algumas referências podem 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);
Neste caso de design ruim, o PHP não liberará a memória mesmo se removermos $a e $b, pois eles fazem referência um ao outro, levando o PHP a acreditar que eles ainda estão em uso.
Felizmente, existe outro mecanismo chamado Cycle Collector para isso:
gc_collect_cycles();
Grosso modo, o coletor percorre todas as referências e aplica um algoritmo para marcar os objetos em uso, que revela os objetos a serem coletados (os não marcados).
No entanto, o PHP não aciona a coleta automática de ciclos até que os limites de 10.000 objetos com possíveis referências cíclicas sejam atingidos.
Novamente, não é mágica, então você deve invocar gc_collect_cycles() apenas em alguns casos.
Um design ruim pode levar a relacionamentos excessivamente complexos entre objetos, levando a mais referências e coleta de lixo mais frequente.
Cada objeto contado por referência requer armazenamento adicional para sua contagem de referência.
Fonte: Wikipedia - Contagem de referências
A sobrecarga associada às operações de limpeza de memória pode impactar significativamente o desempenho global e, em última análise, aumentar o tempo de execução em cenários específicos.
10 anos atrás, o Composer obteve um grande aumento de desempenho apenas usando a função gc_disable().
Fonte: Composer - desabilitando GC
Na verdade, o PHP 7 melhorou drasticamente o GC, então não é mais o que era em 2014.
Além disso, as versões do PHP 8 melhoraram as estratégias de alocação de memória e adicionaram estatísticas mais úteis sobre as operações do GC para melhor monitoramento (gc_status() na versão 8.3).
A maioria dos aplicativos PHP são orientados por solicitação e a memória é limpa automaticamente no final da solicitação.
Novamente, é muito legal, mas não mágico. O que acontece com solicitações assíncronas e objetos/daemons de longa duração?
Você pode enfrentar vazamentos de memória em algum momento.
Neste ponto, você pode não ver como o GC do PHP difere de outras linguagens.
Na maioria das vezes, outras linguagens não dependem da contagem de referências para coletar lixo ou podem usar implementações diferentes.
Por exemplo, muitos usam o algoritmo de rastreamento que também marca objetos não utilizados, mas não opera de forma incremental. É uma travessia de gráfico.
Além disso, algumas linguagens não permitem esse controle direto (por exemplo, ligar/desligar em tempo de execução).
Como sempre, existem algumas vantagens e inconvenientes, então você poderá ver algumas abordagens híbridas.
Você pode aproveitar os ajudantes gc_* integrados.
Por exemplo:
Essas funções são úteis para depuração ou ajuste fino da coleta de lixo quando necessário.
Você pode ler esta postagem para obter mais informações:
PHP 7.4 introduziu referências fracas e PHP 8 introduziu mapas fracos.
Um Mapa Fraco pode ser descrito como uma coleção de Referências Fracas.
Esta estrutura de dados é um armazenamento versátil de valores-chave que ajuda o PHP a controlar os itens sem criar confusão ou consumir espaço excessivo.
Você pode vê-lo como um armazenamento temporário que será limpo imediatamente quando não for mais necessário, pois não há referências [fortes] que possam impedir a coleta de lixo:
$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
Para a maioria dos usos, você não precisará se preocupar com o gerenciamento de memória, pois o PHP já cuida disso.
No entanto, como as pilhas modernas utilizam objetos de longa duração, você precisa monitorar seu aplicativo em busca de possíveis vazamentos de memória.
Se você tiver problemas, talvez seja necessário otimizar o código e/ou interagir diretamente com o GC.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3