jeudi 2 décembre 2010

java : rappel sur les options PermGen et Heap

Il peut parfois arriver d'avoir des erreurs de type OutOfMemory : Perm Gen Space ...

Le Head contient les instances en cours, et est "Garbage Collectée". En cas d'OutOfMemory, la taille peut-être simplement modifié via les optionq de JVM suivantes :

-Xms512m
-Xmx1400m


Un moyen simple pour régler ce problème est d'utilser des options non standard (<=> -X: ou -XX: mais présente sur les JVM Sun) et d'augmenter les tailles du permGen:


-XX:PermSize=128M
-XX:MaxPermSize=256M


Qu'est ce que cela signifie ?

Si je regarde la consommation de mon programme ... je m'aperçoit que le HEAP ne consomme que 5% de la mémoire !!! or j'ai un OutOfMemory.

Ce qu'il faut comprendre c'est que le PermGen est la zone mémoire ou sont stockés les classes chargées, les méthodes, les Strings, les annotations, et les membres static !!! Et surtout, contrairement au Heap, elle ne sont pas "Garbage Collecté". Du coup, cette mémoire ne peut qu'augmenter !!:

Du coup, si un membre "static" est un singleton , qui a un rôle de cache par exemple, ce dernier peut-être très gourmand et conduire à ce genre d'erreur. De plus, lors de la compilation de JSP, ces dernières sont compilées et transformées en servlet, et donc chargée dans le "PermGen".

De plus, il est à noter qu'à chaque modification d'une méthode ou d'une classe, cette dernière est de nouveau chargée en "PermGen".

Ceci peut donc être catastrophique,lorsque l'on utilise des librairies qui modifient les classes comme par exemple :
- les librairies d'instrumentation de code
- ou qui de programmation par aspect ... (Spring, bcel, cglib, asm, etc...)

Lors de ce genre de problème, il faut tout de même se poser la question, de savoir si cette augmentation de la taille de la mémoire est justifiée (ex: singleton de chargement d'un référentiel) , ou si elle provient d'un problème plus profond de conception.

Aucun commentaire:

Enregistrer un commentaire