2009-10-05 7 views
4

Je lance mon code Java (1.6.0_16 dans Vista) avec les paramètres suivants (parmi d'autres) -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs. Je cours le code et je peux voir dans les journaux il y a deux MOO.-XX: + HeapDumpOnOutOfMemoryError ne crée pas de fichier hprof dans OOM

Le premier que je sais parce que je peux voir dans le stdout que le fichier hprof est créé:

java.lang.OutOfMemoryError: Java heap space 
Dumping heap to ../logs\java_pid4604.hprof ... 
Heap dump file created [37351818 bytes in 1.635 secs] 

Et puis, vers la fin du code, je reçois un autre OOM, je capture, mais Je ne reçois pas un deuxième fichier hprof créé. Quelqu'un sait pourquoi c'est ça? Est-ce parce que j'ai capturé l'exception de MOO?

Répondre

2

Si vous voulez en savoir plus, vous pouvez essayer jmap ou garder jconsole sur le jvm (version 6) alors vous pouvez après tout écrasé i.e le matin créer votre propre vidage de jconsole (ou votre outil d'analyseur de choix).

Plus sur le sujet de dumping peut être lu dans Eclipse MemoryAnalyser.

4

Je ne tenterais pas de récupérer à partir d'une erreur OutOfMemoryError car certains objets pourraient se retrouver dans un état indéfini (en pensant à une ArrayList qui ne pourrait pas allouer son tableau pour stocker la date par exemple). En ce qui concerne votre question, je soupçonne que -XX: + HeapDumpOnOutOfMemoryError ne fait que créer un seul vidage intentionnellement pour éviter plusieurs vidages de tas: il suffit de penser à plusieurs threads qui lancent un OOME en même temps, causant un vidage de tas pour chaque exception levée. En résumé: n'essayez pas de récupérer à partir de OOME et ne vous attendez pas à ce que la machine virtuelle Java écrit plus d'un vidage de tas. Cependant, si vous ressentez toujours le besoin de générer un vidage de tas, vous pouvez essayer de gérer manuellement une exception OOME et appeler jmap pour créer une sauvegarde ou utiliser "-XX: + HeapDumpOnCtrlBreak" (pas sûr cependant, comment simuler CtrlBreak par programme) . Un manque de mémoire génère un seul fichier de vidage lors de la première erreur.

+0

bien je sais sur le conseil de ne pas essayer de récupérer du MOO mais dans ce cas je dois, dois, et dans beaucoup de cas tout fonctionne bien. Mais votre hipothesys sonne bien, peut-être qu'un seul est créé exprès ... En recherchant ce problème, j'ai trouvé une question ici dans stackoverlfow qui a montré comment créer la sauvegarde par programmation, mais ne peut pas le trouver maintenant – Persimmonium

Questions connexes