2009-05-25 11 views
27

J'essaie d'exécuter la commande jstack sur mon application Java. L'application est plutôt grande, s'exécutant à l'intérieur de jboss AS occupant environ 4 Go de mémoire. Le système d'exploitation est Windows Server 2003 Standard Edition. Chaque fois que j'obtiens une erreur "Pas assez de stockage disponible pour traiter cette commande". Il y a assez de RAM, 16 Go et d'espace disque. Alors, des idées?Jstack et Stockage insuffisant pour traiter cette commande

+3

Cela semble être un message d'erreur Windows. –

+0

Je l'ai sur un Tomcat qui prend 280 mb. – ripper234

+0

Également regardé cette question - http://stackoverflow.com/questions/222108/getting-the-java-thread-id-and-stack-trace-of-run-away-java-thread Il doesn ' t aide comme jconsole ne voit pas l'application. – ripper234

Répondre

43

Je suis tombé récemment sur ce Win2008r2 et pensé que je partage ma solution car il a fallu un certain temps pour comprendre. Rob's comment about psexec -s est ce qui l'a fait pour moi.

Il semble que Vista et plus tard jstack ne fonctionne pas contre les services en raison du contexte de l'utilisateur. Cela n'a rien à voir avec la mémoire. Je suppose que c'est la même raison pour laquelle les gens ont vu ce problème en 2003 via le bureau à distance, sauf si vous utilisez le commutateur/admin ou/console sur mstsc. À partir de Vista, la sécurité renforcée est probablement ce qui l'a brisé.

Démarrage de mon application à partir d'une fenêtre cmd a bien fonctionné, mais cela ne m'aide pas à déboguer notre installation standard. L'activation du port de débogage Java (pour VisualVM, Eclipse ou la plupart des débogueurs Java) nécessite un redémarrage de l'application, ce qui vous fait perdre l'état que vous essayez probablement de capturer si le débogage n'est pas activé. Démarrage du service sous mes informations d'identification de l'utilisateur n'a pas fonctionné - j'étais un peu surpris de cela. Mais psexec -s exécute jstack à partir du contexte système, qui a fonctionné comme un charme. Oh, et vous aurez besoin d'exécuter psexec à partir d'une invite de cmd élevée, si UAC est activé.

+0

Cela a très bien fonctionné pour moi. –

+1

idem. Merci pour avoir sauvé ma journée –

+0

Cela fonctionne très bien avec Win 2003. Merci beaucoup – dAm2K

3

Nous avons rencontré des problèmes lors de l'exécution de JStack sur une machine Windows, même avec une application modeste (1 Go). Nous avons fini par faire notre analyse de pile et tas en utilisant Netbeans. Cela a semblé faire face à l'analyse des fichiers de vidage beaucoup mieux. YMMV.

Essayez Netbeans pour le profilage - c'est très bon. Notez que VisualVM est un profileur Cutdown NB et est livré avec 6u7.

7

Dans le passé, je l'ai vu lorsque la machine virtuelle Java est en cours d'exécution en tant que service Windows sur Windows 2003.

Tout d'abord, vérifiez si cela est un issue with the TMP directory. Deuxièmement, jstack (ou les autres utilitaires comme jconsole) ne se connectera pas au processus local à moins qu'il ne s'exécute dans la même session. Si le service s'exécute en tant qu'utilisateur spécifique, vous pourrez peut-être vous connecter en vous connectant à la même session. Si vous utilisez Remote Desktop, vous pouvez vous connecter en utilisant "mstsc/admin" (utilisé pour être/console) et essayer de lancer à nouveau jstack. Assurez-vous de vérifier que le répertoire TMP est correctement défini si cela ne résout pas le problème. Si le service s'exécute en tant que LocalSystem, la procédure ci-dessus n'aidera probablement pas beaucoup. Je ne sais pas s'il existe un moyen de se connecter à la même session que LocalSystem. D'autres alternatives peuvent être de configurer le processus pour la surveillance à distance et d'utiliser jvisualvm (à partir du serveur lui-même ou d'une autre machine) pour se connecter sur un port et effectuer un vidage de thread.

+16

Solution si elle s'exécute en tant que système local: Connectez-vous en utilisant "mstsc/admin" en utilisant un compte de connexion (pas sûr des autorisations exactes dont elle a besoin, le mien était dans le groupe Administrateurs) et utilisez l'outil pysec Sysinternals comme suit: psexec -s "% JAVA_HOME% \ bin \ jstack.exe" PID> stack.txt Où PID est l'ID de processus de votre processus. Vous devrez peut-être également remplacer le chemin d'accès réel à votre JDK en fonction de votre environnement spécifique. –

2

psexec -s jstack PID >> c:\jstack.log fonctionne parfaitement sur la même machine. Pour la première fois il a fallu du temps mais encore une fois j'ai exécuté avec l'option de redirection vers fichier, il a terminé avec quelques secondes.

Questions connexes