2009-05-25 1 views
27

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

+3

Это сообщение об ошибке Windows. –

+0

У меня есть это на Tomcat, который занимает 280 мб. – ripper234

+0

Также посмотрел на этот вопрос - http://stackoverflow.com/questions/222108/getting-the-java-thread-id-and-stack-trace-of-run-away-java-thread Это не " t help, поскольку jconsole не видит приложение. – ripper234

ответ

43

Я столкнулся с этим в последнее время на Win2008R2 и думал, что я разделю свое решение, так как это потребовалось некоторое время, чтобы выяснить. Rob's comment about psexec -s - это то, что сделал это для меня.

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

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

+0

Это работало отлично для меня. –

+1

так же. спасибо за сохранение моего дня –

+0

Это отлично работает с Win 2003. Большое вам спасибо – dAm2K

3

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

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

7

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

Во-первых, проверьте, чтобы увидеть, если это issue with the TMP directory.

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

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

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

+16

Решение, если оно работает как локальная система: Подключитесь с помощью «mstsc/admin» с помощью учетной записи входа (не обязательно точные разрешения, которые должны быть у нее, мой был в группе «Администраторы») и используйте инструмент sysinternals psexec следующим образом: psexec -s "% JAVA_HOME% \ bin \ jstack.exe" PID> stack.txt Где PID - это идентификатор процесса вашего процесса. Возможно, вам также придется заменить фактический путь на ваш JDK в зависимости от конкретной среды. –

0

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

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

2

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