2010-06-28 6 views
5

J'essaie de diagnostiquer un problème de fuite de mémoire PermGen dans un serveur d'applications Sun One 9.1. Pour ce faire, j'ai besoin d'un vidage de tas du processus JVM. Malheureusement, le processus JVM est la version 1.5 exécutée sous Windows. Apparemment, aucune des façons de déclencher un vidage de tas ne supporte cette configuration. Je peux faire en sorte que la JVM effectue un vidage de mémoire après l'épuisement de la mémoire ou l'arrêt de la mémoire, mais je dois pouvoir obtenir des vidages de tas à des heures arbitraires.Trigger Hump Dump d'une JVM 1.5 s'exécutant sous Windows

Les deux méthodes mentionnées ci-dessus pour l'obtention de vidages de tas utilisent jmap ou utilisent le MBean HotSpotDiagnostic. Aucun de ceux-ci ne supporte jvm 1.5 sous Windows.

Y at-il une méthode que j'ai manquée? S'il y a un moyen de déclencher par programme un vidage de tas (sans utiliser le MBean HotSpotDiagnostic), cela le ferait aussi ...

Si ce n'est vraiment pas possible de le faire sous Windows, je suppose que je devrais recourir à la construction une machine virtuelle Linux et faire mon débogage là-bas.

Merci.

+1

J'ai eu recours à l'aide -XX: + HeapDumpOnOutOfMemoryError avec une page jsp qui essaie d'allouer de très grands tableaux. Je peux juste frapper la page de jsp quand j'ai besoin d'un vidage de mémoire. Fonctionne assez bien. – jthg

Répondre

1

Une nouvelle option de point d'accès a été introduite dans Java6, -XX:-HeapDumpOnOutOfMemoryError, qui était en fait rétroportée sur la JVM Java5.

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

tas de vidage de fichier lors java.lang.OutOfMemoryError est jeté. Gérable. (Introduit dans 1.4.2 mise à jour 12, 5.0 mise à jour 7.)

C'est très pratique. La JVM vit juste assez longtemps pour déverser son tas dans un fichier, puis tombe.

Bien sûr, cela signifie que vous devez attendre que la fuite devienne suffisamment grave pour déclencher un OutOfMemoryError. Une alternative est d'utiliser un profileur, comme YourKit. Cela fournit les moyens de prendre un instantané de tas d'une machine virtuelle Java en cours d'exécution. Je crois qu'il supporte toujours Java5.

P.S. Vous vraiment besoin de passer à Java 6 ....

+0

Merci. J'ai utilisé cette méthode, mais ce n'est pas assez. J'ai besoin de déclencher une décharge de tas à un moment arbitraire. – jthg

+0

@jthg: Donc, voir la suggestion de profileur que j'ai faite ainsi – skaffman

+0

Je penserai au profileur s'il n'y a pas de solution libre. – jthg

0

Si c'est 1.5.0_14 ou tard, vous pouvez utiliser -XX:+HeapDumpOnCtrlBreak et appuyez sur Ctrl-Break dans la console

+0

Peut Ctrl-Break être envoyé à un processus s'il n'y a pas de console? Ou savez-vous s'il est possible que le serveur Sun One App conserve une console ouverte au processus jvm? – jthg

+0

Vous n'êtes pas sûr du serveur Sun One. Les manières courantes sont: 1- éditer les scripts de démarrage (si présents) et remplacer javaw par java; 2- trouver la classe principale et l'exécuter manuellement – unbeli