2010-03-20 10 views
9

Jusqu'à présent, j'ai appris à générer des vidage de threads et de tas en utilisant respectivement jstack et jmap.Équivalence de vidage du noyau pour Java

Cependant, jstack la sauvegarde de thread contient uniquement des textes décrivant la pile sur chaque thread. Et l'ouverture du tas (fichier .hprof) avec Java VisualVM ne montre que les objets alloués dans le tas. Ce que je veux réellement, c'est pouvoir voir la pile, passer à une trame de pile particulière et regarder des variables locales. Ce type de débogage post-mortem peut être fait normalement avec des outils comme WinDbg, gdb et un fichier core (pour un programme C++ natif.)

Je me demande si un tel fichier 'core' (qui me permettra de déboguer en non -live environnement) existe-t-il en Java?

Répondre

2

J'ai trouvé des informations pertinentes dans un Sun forum et dans un SO discussion: Je n'ai pas eu beaucoup de chance avec cela, mais cela pourrait fonctionner dans votre cas.

Remarque: certains des outils mentionnés sont des outils Java, mais ils ne sont pas pris en charge et ne sont pas disponibles dans les versions Windows du JDK.

+0

Merci. Je pense que 'jsadebugd' est très proche de ce que je cherche. – Gant

1

Je ne pense pas qu'un tel mécanisme de vidage existe en Java standard.

5

Java fait. Si vous utilisez une machine virtuelle IBM, utilisez com.ibm.jvm.Dump.SystemDump() pour générer par programmation un vidage. Cela peut être débogué en utilisant un débogueur. Je crois que "tuer" votre processus Java devrait aussi générer un vidage du système. Pour Unix, utilisez kill -4 pid où pid est l'ID du processus et peut être interrogé en tapant top | grep java si vous avez 1 instance VM en cours d'exécution.

Vous pouvez également ajouter -Xdump:system ou -Xdump:heap etc à votre ligne de commande java pour filtrer les événements et générer des décharges sur certains événements comme VM Stop (-Xdump:system:events=vmstop), des collections complètes de déchets (-Xdump:system:events=fullgc), etc. Remarque, en fonction de votre taille de tas, générer un vidage sur un GC complet n'est peut-être pas une bonne idée (ie vous pourriez créer 50 dumps avec 20 secondes si vous tassez de 4M à environ 60M en 20 secondes) donc vous pourriez ajouter un compteur comme -Xdump:system:events=fullgc,range=50..55 qui génèrerait 5 cœurs entre le 50ème et le 55ème ramassage complet des ordures.

1

Certains systèmes d'exploitation (par exemple Solaris mdb ou gdb sous Linux) prennent en charge l'utilisation du débogueur natif normal sur les fichiers de vidage, avec un support spécial pour l'affichage des cadres de pile Java. Mais c'est assez hardcore et probablement pas ce que vous voulez, car il n'est pas bien intégré avec le Java Debugger.