Tips and tricks pour gérer les fuites mémoires

Tips and tricks pour gérer les fuites mémoires

La notion de « gestion de la mémoire » est incontournable lorsqu’on souhaite faire fonctionner des applications Java sans accroc ; éviter le message d’erreur « OutOfMemoryError » est loin d’être une tâche facile.

Les symptômes :

Lorsqu’une application Java rencontre un problème de mémoire, elle ralentit jusqu’à ce que, à terme, elle ne réponde plus. Il est également possible de rencontrer le message d’erreur « java.lang.OutOfMemoryError ».

Les causes principales :

Les causes potentielles de l’erreur OutOfMemoryError sont nombreuses, comme garder des objets en mémoire depuis trop longtemps ou traiter beaucoup trop de données en même temps. Elle peut également indiquer un problème sur lequel il est impossible d’agir directement, comme une bibliothèque tierce mettant les strings en cache ou un serveur d’application ne libérant pas la mémoire après déploiement.

L’analyse :

Pour analyser un problème de mémoire, il est nécessaire de créer un « heap dump ». Pour ce faire, plusieurs options existent ; la méthode la plus courante étant d’ajouter l’option « XX: +HeapDumpOnOutOfMemoryError » pour indiquer à la JVM d’effectuer automatiquement un head dump lorsqu’une erreur OutOfMemoryError se produit.

Analyser le heap dump

Il existe de nombreux outils d’analyse de heap dump sur le marché. L’un des plus connus, EclipseMAT (Eclipse Memory Analyzer), est disponible (en anglais) à l’adresse suivante : http://www.eclipse.org/mat/

Voici les étapes les plus importantes à suivre lors de l’analyse d’un heap dump.

Overview

L’overview affiche la taille et la quantité totale des objets mais également un diagramme circulaire indiquant les objets les plus volumineux, ainsi que les liens permettant de continuer l’analyse.

Histogram

L’histogramme liste les objets groupés par classes, offrant une bonne indication de la direction à suivre pour continuer l’analyse.

 

Dominator Tree

Le « Dominator Tree » établit la liste des objets les plus volumineux. On pourrait également l’appeler “Keep-Alive Tree” car les sous-noeuds qui suivent montrent les objets qui ne seront pas supprimés par le garbage collector (GC).

 

Path to GC Roots

« Path to the GC Roots » indique les chaînes de références des objets ne devant pas être libérées par le garbage collector. Les objets marqués par un point jaune correspondent aux objets racines.

 

Dominator Tree Grouped by Class Loader

Le groupement par classe permet une analyse plus facile de la mémoire utilisée par chaque composant.

Article traduit par Valtech