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