Comment réparer les fuites de mémoire dans votre application Android

Si votre application est lente sur certains appareils ou si les fonctions d’exécution instantanée d’Android Studio cessent de fonctionner de manière aléatoire, alors vous pourriez avoir des fuites de mémoire.

Quand une fuite de mémoire se produit-elle ?

L’une des grandes choses de Java est le garbage collector (GC). Un garbage collector s’exécute périodiquement pour vérifier les objets qui ne sont pas utilisés et les supprime. Une fuite de mémoire se produira lorsqu’il y a des objets qui ne sont pas utilisés par l’application, mais que le ramasseur d’ordures ne peut pas les reconnaître. Par conséquent, ils resteront dans la mémoire sans être utilisés, réduisant la quantité de mémoire disponible pour l’app, ce qui entraîne des résultats inattendus.

Comment détecter les fuites de mémoire?

Il existe plusieurs façons de le faire. Nous allons en couvrir quelques-unes dans cet article.

Mais d’abord, écrivons un code qui pourrait produire une fuite de mémoire. Nous allons créer une application avec deux activités. L’activité A aura un bouton qui ouvre l’activité B. Parallèlement à cela, nous allons également créer une classe singleton qui détient une référence statique d’un Contexte.

classe Manager {
private static Manager ourInstance;

private Context;

static Manager getInstance(Context context) {
if (ourInstance == null) {
ourInstance = new Manager(context);
}
return ourInstance;
}

private Manager(Context context) {
this.context = context;
}
}

Nous allons appeler ce singleton à partir de l’activité A

Manager.getInstance(this);

Détection des fuites de mémoire à l’aide des moniteurs d’Android Studio

android memory leaks

Android Studio fournit des outils pratiques pour profiler les performances de votre application, et l’un d’eux est le moniteur de mémoire. Nous pouvons utiliser le Memory Monitor pour détecter les fuites de mémoire en suivant les étapes suivantes :

1. Exécutez votre application sur votre appareil mobile ou sur un émulateur.

2. Ouvrez Android Monitor (appuyez sur Cmd + 6 sur Mac ou Alt + 6 sur Windows). En haut de Memory Monitor, cliquez sur Start Allocation Tracking.

3. Utilisez l’app autour de la partie que vous soupçonnez de connaître une fuite de mémoire. Dans notre exemple, nous allons nous rendre dans une autre activité.

4. Cliquez sur Initiate GC pour forcer le garbage collector à commencer à collecter les objets qui ne sont pas actuellement utilisés et à les supprimer. Vous devriez voir le graphique de la mémoire diminuer un peu.

5. Cliquez sur Dump Java Heap pour laisser Android Studio générer un fichier .hprof qui contient un instantané du tas. La façon la plus simple de vérifier une fuite de mémoire est d’utiliser les tâches d’analyse

6. Ouvrez l’onglet Tâches d’analyse et cliquez ensuite sur Exécuter en haut de cet onglet. Vous devriez voir les activités ayant fait l’objet d’une fuite dans l’onglet Résultats d’analyse sous l’onglet Tâches d’analyse.

fuites de mémoire android

Détection des fuites de mémoire à l’aide de Leak Canary

Leak Canary est une bibliothèque faite par Square et c’est un moyen très rapide de détecter les fuites de mémoire. Leak Canary vous permet de détecter les fuites de mémoire sur de plus longues périodes car vous n’avez pas besoin de connecter votre appareil à Android Studio et de surveiller votre application pendant une longue période. Leak Canary vous enverra des notifications dès qu’il y a une fuite de mémoire.

L’intégration de Leak Canary est vraiment facile. Tout ce que vous devez faire est d’ajouter ce qui suit à votre fichier build.gradle au niveau de l’application:

dependencies {
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’
}

Puis ajoutez le code suivant à votre classe d’application:

@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Ce processus est dédié à LeakCanary pour l’analyse du tas.
// Vous ne devez pas initier votre app dans ce processus.
return;
}
LeakCanary.install(this);
/// Code normal d’init d’app…
}

Et voilà, vous êtes prêt à partir.

Détecter les fuites possibles avec Infer

Infer est un outil d’analyse statique fait par Facebook qui vous aide à trouver les exceptions possibles de pointeur nul et les fuites de ressources ainsi que l’accessibilité des annotations, les gardes de verrouillage manquantes et les conditions de course de concurrence. C’est un bon outil à ajouter à votre CI pour surmonter tous les bogues possibles. Il s’agit également d’un logiciel libre, dont le développement est toujours en cours. Vous pouvez trouver plus d’informations sur Infer dans leur documentation de démarrage rapide.

Laisser un commentaire