-
out of memory / visualgc
Bonjour,
Voila, j'interviens sur un projet web sur lequel il y a un problème de mémoire.
j'ai branché visualgc pour voir un peu comment ça se passe dans la jvm :
http://lfournial.free.fr/visualgc/visualgc.jpg
Voici le résultat.
En fait la partie old grossis, grossis, jusqu'à l'exception.
Vous pouvez voir en haut à droite les paramètres actuels de la jvm en prod.
Sauriez vous quelles sont les pistes à suivre pour résoudre ce genre de problèmes svp (options jvm, problèmes dans le code ...etc ... ) ?
Un grand merci d'avance pour votre aide :-)
Loïc
PS -
env technique :
jdk 1.4, tomcat 4.1.31, win 2003 server (2Go de Ram)
-
Il faut y aller par étape. Tout d'abord bien déterminer après quelle action la mémoire grossie. Tenter de trouver le code fautif à partir de cette action.
Si ça ne marche toujours pas, supprimer un maximum de code jusqu'à ne plus avoir de problème de mémoire, puis ajouter les fonctionnalités une à une.
Les fonctionnalités/modules/bout de code seront bouchonnés lorsqu'ils sont enlevés.
C'est un travail long et pénible, bon courage :roll:
L'essentiel est de savoir rester calme lorsque le coupable est identifié :mouarf:
-
Salut,
Je ne pense pas que les options de la JVM puissent résoudre ton problème : si tu as une OutOfMemory cela signifie que le GC a tenté tout son possible pour libérer la mémoire...
:arrow: Ton application consomme trop !
- Soit c'est "normal" car tu traites de très grosse quantité de données, et dans ce cas la seule solution serait d'augmenter le max-heap via -Xmx.
- Soit comme cela semble être le cas, la mémoire grossi petit à petit au fur et à mesure de l'utilisation de l'application. C'est typique d'une application qui conserverait des références inutiles : le GC ne pouvant donc pas libérer les objets.
Dans ce second cas il faut vérifier tous les éléments "static" (et dans le scope "application" pour une appli Web) :
- Vérifier qu'il n'y ai pas de collections/maps en static qui accumulerait les références...
- Vérifier qu'il n'y ai pas d'objet en static contenant de multiple référence...
- Vérifier plus globalement que le scope de chaque variable/attribut est bien réduit au strict minimum (pas d'attribut d'instance utilisé comme variable locale, etc.)
- ...
Je ne connais pas visualgc, mais avec visualvm il y a un profiler bien sympa qui permet de voir l'occupation mémoire par type d'objet : si une de tes classes vient se hisser dans les premiers résultats tu as une piste pour ton problème (en général les premières places sont occupées par les classes standard et les tableaux).
visualvm a obligatoirement besoin de Java 6 pour fonctionner, mais il semblerait qu'il puisse se connecter à n'importe quel application à partir de Java 1.4.2 (mais je n'ai pas testé).
a++
-
Quel type de OutOfMemory as-tu : heap, perm space,... ?
C'est marqué après le nom de l'exception.
Alexis
-
Bonjour,
Merci pour toutes vos réponses,
-> dinobogan : Merci, du courage j'en ai besoin ;)
-> adiGuba : Merci , je vais installer visualVM pour voir si je peux affiner le ciblage pour trouver le coupable. Je pencherais aussi pour ta seconde proposition, à savoir un certain nombre de références inutiles qui empêche un bon GC. J'invertigue et vous tiens au courant
-> Alexis : Merci , C'est un OutOfMemory heap ...
Je vous tiens au courant de l'avancement,
Merci
@+
Loïc