Sobes.tech
Middle+

Как LeakCanary обнаруживает утечку памяти?

sobes.tech IA

Resposta da IA

LeakCanary funciona em várias etapas:

  1. Detecção de fuga: Acompanha o ciclo de vida dos objetos observados, como Fragment, Activity, View. Quando tal objeto é destruído, LeakCanary coloca-o numa referência fraca (WeakReference) e inicia o coletor de lixo.
  2. Verificação da referência: Após a coleta de lixo, o LeakCanary verifica se ainda existe uma referência ao objeto. Se a referência ainda existir, isso significa que o objeto não foi coletado e provavelmente há uma fuga.
  3. Dump da memória (heap dump): Em caso de detecção de uma possível fuga, o LeakCanary faz um dump da memória (heap dump) da aplicação. É uma captura de toda a memória ocupada pelos objetos da aplicação em um dado momento.
  4. Análise do grafo de objetos: O LeakCanary analisa o grafo de objetos no dump de memória para encontrar um caminho desde as raízes do coletor de lixo (GC roots) até o objeto suspeito de estar fugindo. Este caminho mostra por que o objeto não foi coletado.
  5. Geração do relatório: Com base na análise, o LeakCanary gera um relatório com detalhes sobre a fuga, incluindo o caminho de retenção do objeto (o objeto retentor referencia o objeto retido), o tipo de objeto e o local no código onde provavelmente ocorreu a fuga. O relatório é exibido como uma notificação ou dentro da aplicação.
// Exemplo simples de rastreamento de um objeto A após sua destruição
@Override
protected void onDestroy() {
    super.onDestroy();
    // Envolve o objeto numa WeakReference e passa ao LeakCanary
    refWatcher.watch(this);
}

LeakCanary usa seus próprios analisadores e algoritmos para analisar arquivos hprof (formato de dump de heap) para encontrar eficientemente caminhos de retenção de objetos.