Comment fonctionne le Garbage Collector de la JVM

Publié le 26 Mai 2010

La performance d'une appli java est bien entendu lié à la qualité de code écrit mais pas seulement. En effet une partie importante des performances est liée à l'utilisation (et donc à la configuration) du garbage collector.

 

Ceci pour la simple raison que le garbage collector peut interrompre notre application à tout moment pour nettoyer la mémoire. Dans ce cas on perd la main et on n'a plus aucun controle sur le temps d'exécution de notre application.

 

Petite parenthèse sur Java Real Time: Java Real Time n'est pas plus rapide qu'une JVM classique mais il offre la garantie que les phases de garbage collection ne dépassera pas une durée données (ex: 20 ms). Ce qui permet d'avoir un controle plus fin du temps d'exécution d'une appli java.

En revanche ça ne signifie pas que l'appli sera plus rapide en moyenne. Simplement on garantie que l'appli ne sera jamais bloqué plus de 20 ms par le GC.

 

Ceci étant dit, retournons à notre GC classique. Pour optimiser une application java il faut donc paramètrer la jvm pour éviter au maximum les phases de full garbage qui nettoie toute la mémoire allouée et qui peuvent parfois durer plusieurs secondes.

 

Pour ce faire il est essentiel de comprendre comment fonctionne le GC :

 

La JVM gère 3 espaces mémoires différents dans lesquels sont stockés les objets java:

 - la young generation

 - la old generation

 - permanent storage

 

Commençons par le plus trivial le permanent storage. Cet espace mémoire est alloué directement au démarrage de la JVM. Il contient les objets java permanent qui seront présent pendant toute la durée d'exécution.

 

Ensuite la young generation : c'est là où sont créées les nouvelles instances des objets java. L'exécution du GC sur cette partie de la mémoire reste assez performante.

La young generation peut contenir des zones "survivor space" où les objets seront copiés progressivement avant de migrer vers la old generation.

 

La old generation contient des objets assez vieux qui ont survécu un certain temps dans la young generation. L'execution du GC sur cette partie de la mémoire est très couteuse et c'est ce type d'exécution qu'il faut chercher à éviter. il faut donc mettre que les objets qui ne doivent pas être effacés.

 

Tout l'art du tuning de la JVM va consister à allouer des espaces mémoires appropriés pour les différentes zones afin d'atteindre le comportement souhaité.

Rédigé par Bliz

Publié dans #Java

Repost 0
Commenter cet article

Parfait 13/03/2011 15:35



good article