web-dev-qa-db-fra.com

Jstack et pas assez de stockage est disponible pour traiter cette commande

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

28
tropikalista

Je me suis retrouvé récemment sur Win2008r2 et je pensais partager ma solution car il fallait un certain temps pour le résoudre. Le commentaire de Rob à propos de psexec -s est ce qui l'a fait pour moi.

Il semble que sur Vista et les versions ultérieures, jstack ne fonctionne pas avec les services en raison du contexte utilisateur. Cela n'a rien à voir avec la mémoire. J'imagine que c'est la même raison pour laquelle les gens ont vu ce problème en 2003 via un poste de travail distant, à moins que vous utilisiez le commutateur/admin ou/console sur mstsc. À partir de Vista, le renforcement de la sécurité est probablement ce qui l'a brisée.

Le démarrage de mon application depuis une fenêtre de commande a bien fonctionné, mais cela ne m'a pas aidé à 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. Vous perdez donc l'état que vous essayez probablement de capturer si le débogage n'est pas déjà activé. Le démarrage du service avec mes informations d'identification d'utilisateur ne fonctionnait pas - cela m'a un peu surpris. Mais psexec -s exécute jstack à partir du contexte système, ce qui a fonctionné à merveille. Oh, et vous devrez exécuter psexec à partir d'une invite de commande élevée, si le contrôle de compte d'utilisateur est activé.

44
Eric McNeill

Dans le passé, je l’ai vu lorsque la machine virtuelle Java s’exécutait en tant que service Windows sous Windows 2003.

Tout d’abord, vérifiez s’il s’agit d’un problème avec le répertoire TMP .

Deuxièmement, jstack (ou les autres utilitaires tels que jconsole) ne se connectera pas au processus local à moins que celui-ci ne soit exécuté 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 à l'aide de "mstsc/admin" (anciennement/console) et essayer de relancer jstack. Assurez-vous 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 ne vous aidera probablement pas beaucoup. Je ne sais pas s'il existe un moyen de se connecter à la même session que LocalSystem.

Une autre solution consiste à configurer le processus pour la surveillance à distance et à utiliser jvisualvm (à partir du serveur lui-même ou d'une autre machine) pour se connecter via un port et effectuer un vidage de thread.

7
Rob Tanzola

Nous avons eu des problèmes d’exécution de JStack sur une machine Windows avec une application même modeste (1 Go). Nous avons fini par analyser notre pile et pile avec Netbeans. Cela semblait beaucoup mieux gérer l’analyse des fichiers de vidage. YMMV.

Essayez Netbeans pour le profilage - c'est très bien. Notez que VisualVM est un profileur de réduction NB et est fourni avec 6u7.

3
Fortyrunner

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

2
Alex

Ceci est un message d'erreur du système d'exploitation sous-jacent. Dans votre code, vous ne pouvez pas faire grand chose pour résoudre ce problème, sinon attraper l'exception qui est levée. Boo à Windows pour être si limité.

http://technet.Microsoft.com/en-us/library/cc978735.aspx

0
Dr. Nichols