Sobes.tech
Middle+

Como o LeakCanary detecta referências a Activities destruídas?

sobes.tech IA

Resposta da IA

O LeakCanary usa uma referência fraca (Referência Fantasma) ou uma referência forte (Referência Forte) num observador especial que "ouve" o ciclo de vida da Activity. Quando a Activity é destruída, o LeakCanary regista o tempo e espera pela recolha de lixo. Se, após a recolha, o objeto Activity ainda existir na memória, o LeakCanary inicia um despejo de heap, analisa-o e constrói um gráfico de acessibilidade para encontrar o caminho desde as raízes do GC até a Activity "com fuga".

Passos principais:

  1. Monitorização do ciclo de vida: O LeakCanary regista ActivityLifecycleCallbacks.
  2. Marcador (Bookmarking): Ao chamar onDestroy(), o LeakCanary cria uma referência à Activity (dependendo da versão) e regista a hora.
  3. Aguardar GC: O LeakCanary espera que a recolha de lixo aconteça para verificar se o objeto foi destruído.
  4. Verificação após GC: Se o objeto Activity ainda estiver acessível após o GC, indica uma potencial fuga.
  5. Despejo de heap: O LeakCanary chama Debug.dumpHprofData() para guardar o estado atual da memória.
  6. Análise do despejo: O LeakCanary (através do Memory Analyzer Tool (MAT) ou seu próprio analisador) escaneia o despejo de memória.
  7. Procura de caminho: A ferramenta encontra caminhos no grafo de objetos desde os elementos raiz do GC até ao objeto "com fuga".
  8. Relatório: O LeakCanary gera um relatório legível, mostrando a cadeia de referências que mantém o objeto fora do GC.