Ceux qui ont déjà développé en C, puis en Java auront probablement apprécié
la gestion de la mémoire par la JVM. En effet, Java masque la complexité de la
gestion de la mémoire aux développeurs. Cette tache est déléguée au
garbage Collector
. Cependant même si cette gestion est dite
'automatique', cela ne permet pas de faire n'importe quoi. Que ce soit en C,
Java, ou un autre langage, la mémoire est une ressource limitée ! En java
lorsque la JVM n'a plus assez de mémoire pour s'exécuter, elle génère une
Erreur java.lang.OutOfMemoryError
.
Plusieurs cas sont alors possible :
- Soit vous n'avez pas alloué assez de mémoire à la JVM
- Soit votre code a ce qu'on appelle un fuite mémoire
Si vous êtes dans le premier cas, les choses se résolvent assez
facilement : il vous suffit d'allouer plus de mémoire grâce aux paramètres
-Xmx
, -Xms
et -XX:PermSize
(ou de
modifier le code pour qu'il gaspille moins de mémoire). Dans le deuxième cas
vous allez devoir trouver où se situe la fuite mémoire. Si vous avez utilisé
des logiciels pour vous y aider, vous avez peut être été perdu par toutes les
possibilités qu'ils offrent et par la profusion d'informations qu'il
fournissent.
Le but de ce billet est d'expliquer comment détecter et corriger les fuites mémoires avec Eclipse Memory Analyser Tool un outil gratuit et très utile qui aide vraiment à trouver les fuites mémoires. Nous allons voir comment extraire les informations pertinentes, les comprendre, et trouver les responsables des fuites mémoire en ayant une approche pragmatique. Je vous propose de nous appuyer sur du code simple (disponible en fichier attaché à ce billet) générant une fuite mémoire.