Jstack и Недостаточно памяти для обработки этой команды - PullRequest
28 голосов
/ 25 мая 2009

Я пытаюсь запустить команду jstack в моем java-приложении. Приложение довольно большое, работает внутри jboss AS и занимает около 4 ГБ памяти. ОС Windows Server 2003 Standard Edition. Каждый раз, когда я получаю сообщение об ошибке «Недостаточно памяти для обработки этой команды». Достаточно оперативной памяти, 16 ГБ и дискового пространства. Итак, есть идеи?

Ответы [ 5 ]

44 голосов
/ 12 июня 2010

Я столкнулся с этим недавно на Win2008r2 и подумал, что поделюсь своим решением, так как потребовалось время, чтобы разобраться. Комментарий Роба о psexec -s - это то, что сделал это для меня.

Похоже, что в Vista и более поздних версиях jstack не работает со службами из-за пользовательского контекста. Это не имеет ничего общего с памятью. Я подозреваю, что это та же самая причина, по которой люди видели эту проблему в 2003 году через удаленный рабочий стол, если вы не используете ключ / admin или / console на mstsc. В Vista ужесточение безопасности, вероятно, и сломало ее.

Запуск моего приложения из окна cmd работал нормально, но это не помогает мне отладить нашу стандартную установку. Включение порта отладки Java (для VisualVM, Eclipse или большинства других отладчиков Java) требует перезапуска приложения, поэтому вы теряете состояние, которое, вероятно, пытаетесь захватить, если у вас еще не включена отладка. Запуск службы под моими пользовательскими учетными данными не работал - я был немного удивлен этим. Но psexec -s запускает jstack из системного контекста, который работает как шарм. О, и вам нужно будет запустить psexec из командной строки с повышенными привилегиями, если UAC включен.

7 голосов
/ 05 ноября 2009

В прошлом я видел это, когда JVM работает в качестве службы Windows в Windows 2003.

Сначала проверьте, является ли это проблемой с каталогом TMP .

Во-вторых, jstack (или другие утилиты, такие как jconsole) не будут подключаться к локальному процессу, если он не запущен в том же сеансе. Если служба работает от имени определенного пользователя, вы можете подключиться, войдя в тот же сеанс. Если вы используете удаленный рабочий стол, вы можете подключиться с помощью «mstsc / admin» (раньше это был / console) и попытаться снова запустить jstack. Обязательно проверьте, правильно ли установлен каталог TMP, если это не решит проблему.

Если служба работает как LocalSystem, описанная выше процедура, вероятно, не сильно поможет. Я не знаю, есть ли способ войти в тот же сеанс, что и LocalSystem.

Некоторые другие альтернативы могут заключаться в настройке процесса для удаленного мониторинга и использовании jvisualvm (с самого сервера или другого компьютера) для подключения через порт и выполнения дампа потока.

3 голосов
/ 26 мая 2009

У нас были проблемы с запуском JStack на компьютере с Windows даже с небольшим приложением (1 ГБ). Мы закончили анализ стека и кучи с использованием Netbeans. Это, казалось, справлялось с разбором файлов дампа намного лучше. YMMV.

Попробуйте Netbeans для профилирования - это очень хорошо. Обратите внимание, что VisualVM является сокращенным NB-профилировщиком и поставляется с 6u7.

2 голосов
/ 29 августа 2012

psexec -s jstack PID >> c:\jstack.log отлично работает на той же машине. Впервые это заняло некоторое время, но снова я выполнил с параметром перенаправления в файл, это завершилось за несколько секунд.

0 голосов
/ 05 марта 2010

Это сообщение об ошибке из основного O / S. В вашем коде мало что можно сделать, чтобы справиться с этим, кроме как поймать исключение, которое выдается. Boo к Windows за то, что он так ограничен.

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

...