26
Dans un post précédent, nous avons vu le fonctionnement de la JVM (cf. http://www.opensides.fr/?p=271). Aujourd’hui nous allons voir à quoi sert la zone PermGen et surtout comment éviter les erreurs de type PermGen OutOfMemory..
C’est quoi la PermGen ?
La PermGen est un segment de mémoire dans laquelle sont stockés le bytecode et les type primitifs lors chargement de l’application. Cette zone mémoire contient donc l’ensemble des classes permettant à la JVM de créer les instances à partir de ces classes. (la voici tout à gauche sur le schéma).
Cette zone est donc chargée une fois lors du déploiement de l’application, c’est ensuite la Heap (Young et Old) qui seront sollicité pendant le cycle de vie de l’application.
C’est quoi un OutOfMemory error ?
A chaque nouveau déploiement, les nouvelles classes sont chargées dans la PermGen et il arrive parfois (souvent ?) que cette zone mémoire sature en nous affichant alors le message bien connu:
java.lang.OutOfMemoryError: PermGen space
Comment résoudre ce problème ?
Une première optimisation consisterait à augmenter la taille de cette zone:
-XX:PermSize=128m
C’est très pratique mais ça ne fait que repousser le problème
Nous avons vu que le garbage Collector n’intervient que sur le tas (la Heap) mais jamais sur la zone PermGen. Voici donc 2 options qui permettent d’activer le Garbage sur la heap en cas de saturation mémoire.
-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
Je n’ai rien trouvé dans la doc officielle de Sun sur l’explication précise de ces options, juste des votes pour qu’elles soit intégrées par défaut dans les prochaines version de la JVM (peut être dans la Dolphin): http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6329603