Gestion mémoire de la JVM
Optimisation de la gestion mémoire
Le principe
But de l'optimisation
Les objectifs sont multiples :
- Ne plus rencontrer l'erreur "Out of Memory Error", ce qui peut arriver régulièrement lorsque l'on utilise beaucoup de page JSP (ces dernières deviennent du code statique qui saturent la zone Perm) ;
- Passer moins de temps à faire du GC (Throughput Goal) ;
- Réduire le temps de chaque GC (Pause Goal).
Méthode
Une fois ses besoins évalués, la méthode pour optimiser la mémoire d'une JVM est simple :
- Il est tout d'abord important de laisser la JVM travailler par elle même sans aucune option afin d'étudier son comportement. A terme, les tailles mémoires des différentes zones resteront fixes ;
- On note ensuite ces valeurs, et on leur rajoute environ 15% afin de s'assurer que la nouvelle valeur ne puisse être atteinte ;
- Enfin, on teste le comportement de la JVM avec les valeurs que l'on a déterminé.
Il est important de noter qu'il n'existe aucune formule permettant de définir l'optimisation de la JVM. Seul des tests empiriques et l'étude des résultats permettent de déterminer quelle est la meilleure optimisation possible.
De plus, seuls 3 paramètres (modifiable via de nombreuses options) de la JVM permettent d'optimiser cette dernière :
- La taille des zones mémoires ;
- Le taux auquel le GC se déclenche ;
- Le type d'algorithme.
Difficultés
La plus grande difficulté dans l'optimisation de la mémoire Java est qu'il n'existe pas de recette magique et que chaque cas d'optimisation est unique. Seul l'expérience permet de trouver l'optimisation idéale rapidemment.
La seconde difficulté est que les algorithmes de GC ne sont pas spécifiés et dépendent donc de la version de la JVM mais surtout du constructeur de la JVM. Ainsi, on n'optimise pas de la même façon une JVM5 de Sun qu'une JVM5 d'IBM ou même qu'une JVM6 de Sun (le nom des commandes et leur fonction ne sont pas toujours similaires).
Les mauvaises pratiques
Les deux erreurs que l'on retrouve régulièrement sont les suivantes :
- Emploie de la méthode System.gc(). Il est très mauvais de forcer le lancement du garbage collector car le lancement normal de ce dernier est optimisé et l'éxecution à la main perturbe donc le fonctionnement normal ;
- Doubler la quantité de mémoire de la JVM. En effet, on pourrait croire que pour régler un problème de mémoire avec la JVM, il suffit d'augmenter la mémoire. Or, comme nous l'avons vu précédemment, le temps de GC est directement influencé par la taille mémoire (plus la taille de la mémoire est grande, plus le temps pour la traiter sera important).
Les outils
IL existe plusieurs outils pouvant aider au diagnostique des problèmes mémoires :
Sortie GC
La façon la plus simple pour consulter la mémoire de la JVM est la sortie proposée par la JVM avec l'option -verbosegc dont nous pouvons voir un exemple ci-dessous :
[GC 1667K->1295K(1984K), 0.0101756 secs]
[GC 1807K->1434K(1984K), 0.0223998 secs]
[GC 1946K->1574K(2112K), 0.0116185 secs]
[Full GC 1574K->1574K(2112K), 0.0830561 secs]
[GC 3454K->2081K(4672K), 0.0495951 secs]
[GC 4001K->2599K(4672K), 0.0274256 secs]
[GC 4519K->3101K(5056K), 0.0308995 secs]
[Full GC 3101K->3101K(5056K), 0.1452472 secs]
[GC 7039K->4131K(9452K), 0.0777414 secs]
[GC 8227K->5174K(9452K), 0.0627538 secs]
[GC 9270K->6209K(10348K), 0.1125570 secs]
GC Portal
GC Portal est un outil disponible depuis la version 1.4 de Java.
Le gros défaut de cet outil est son installation fastidieuse.
Plus d'informations sur GC Portal disponble sur : http://java.sun.com/developer/technicalArticles/Programming/GCPortal/.
Visual GC
Visual GC est un pluggin NetBeans (également disponible pour Eclipse) permettant de visualiser l'état des différentes zones mémoires en direct.
Plus d'informations sur GC Portal disponible sur : http://management.netbeans.org/visualgc/.
JConsole
JConsole est une console disponible depuis la version 5 du JDK dans le répertoire bin. Ce logiciel permet de se connecter, via le protocole JMX, à n'importe quelle JVM distante et ainsi de consulter en direct l'était mémoire de cette dernière.
Plus d'informations sur JConsole disponble sur : http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html.