Como consertar vazamentos de memória no seu aplicativo Android

Se o seu aplicativo estiver lento em alguns dispositivos ou os recursos de execução instantânea do Android Studio pararem de funcionar aleatoriamente, então você pode estar experimentando vazamentos de memória.

Quando acontece um vazamento de memória?

Uma das grandes coisas sobre Java é o coletor de lixo (GC). Um coletor de lixo corre periodicamente para verificar objetos que não estão em uso e os remove. Um vazamento de memória acontecerá quando houver objetos que não estão em uso pelo aplicativo, mas o lixeiro não consegue reconhecê-los. Assim, eles permanecerão na memória não utilizados, reduzindo a quantidade de memória disponível para o aplicativo, o que causa resultados inesperados.

Como detectar vazamentos de memória?

Existem várias maneiras de fazer isso. Vamos cobrir algumas delas neste artigo.

Mas primeiro, vamos escrever algum código que possa produzir um vazamento de memória. Iremos criar uma aplicação com duas actividades. A atividade A terá um botão que abre a atividade B. Além disso, criaremos também uma classe de um único botão que contém uma referência estática de um Contexto.

class Manager {
private static Manager ourInstance;

contexto de Contexto privado;

static Manager getInstance(Contexto) {
if (ourInstance == nulo) {
ourInstance = novo Manager(contexto);
}
retornar ourInstance;
}

private Manager(Contexto) {
this.context = context;
>}

Vamos chamar este singleton da Activity A

Manager.getInstance(this);

Detecting Memory Leaks Using Android Studio’s Monitors

android memory leaks

Android Studio fornece ferramentas úteis para traçar o perfil da performance da sua aplicação, e uma delas é o Memory Monitor. Podemos usar o Monitor de Memória para detectar vazamentos de memória através dos seguintes passos:

1. Execute seu aplicativo no seu dispositivo móvel ou um emulador.

2. Abra o Monitor Android (Pressione Cmd + 6 no Mac ou Alt + 6 no Windows). No topo do Monitor de Memória, clique em Start Allocation Tracking.

3. Use o aplicativo em torno da parte que você suspeita que possa estar tendo uma fuga de memória. Em nosso exemplo, iremos para outra atividade.

4. Clique em Iniciar GC para forçar o coletor de lixo a começar a coletar objetos que não estão em uso no momento e removê-los. Você deve ver o gráfico de memória diminuir um pouco.

5. Clique em Dump Java Heap para deixar o Android Studio gerar um arquivo .hprof que contém um snapshot do heap. A maneira mais fácil de verificar um vazamento de memória é usando o Analyzer Tasks

6. Abra a aba Analyzer Tasks e então clique em Run no topo desta aba. Você deve ver as atividades vazadas na aba Analysis Results (Resultados da Análise) abaixo da aba Analyzer Tasks.

memory leak android

Detecting Memory Leak Canary

Leak Canary é uma biblioteca feita pela Square e é uma maneira muito rápida de detectar vazamentos de memória. Leak Canary permite que você detecte vazamentos de memória em execuções mais longas porque você não precisa conectar o seu dispositivo ao Android Studio e monitorar o seu aplicativo por um longo período de tempo. O Leak Canary enviará notificações sempre que houver um vazamento de memória.

Integração do Leak Canary é realmente fácil. Tudo que você precisa fazer é adicionar o seguinte ao seu arquivo build.gradle de nível de aplicação:

dependências {
debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.5.1’
releaseCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.5.1’
testCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.5.1’
}

Então adicione o seguinte código à sua classe de aplicação:

@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Este processo é dedicado a LeakCanary para análise de pilha.
// Você não deve iniciar a sua aplicação neste processo.
retorno;
}
LeakCanary.install(this);
/ Código normal da aplicação…
}

E é isso, você está pronto para ir.

Detecting Possible Leaks With Infer

Infer é uma ferramenta de análise estática feita pelo Facebook que ajuda você a encontrar possíveis exceções de ponteiro nulo e vazamentos de recursos, bem como a capacidade de alcance de anotações, guardas de bloqueio ausentes e condições de corrida de concordância. É uma boa ferramenta para adicionar ao seu CI para superar todos os bugs possíveis. É também código aberto, por isso o desenvolvimento da ferramenta ainda está evoluindo. Você pode encontrar mais informações sobre o Infer em sua documentação de Início Rápido.

Deixe um comentário