У меня есть виртуальная машина Java, которая "случайно" зависает. Я цитирую случайный бит, потому что, очевидно, есть причина, по которой ВМ зависает, но зависание не происходит периодически. У нас есть одно и то же программное обеспечение, работающее в разных клиентских средах, и в этих средах JVM не зависает.
В процессе попытки устранения зависания процесс существует с нулевой загрузкой ЦП. Затем я пытаюсь выполнить kill -3, и команда kill зависает. Дамп потоков JVM не создается.
Я потратил время на инструментирование кода для периодического протоколирования трассировки стека потоков, надеясь поймать JVM в состоянии, которое указывало бы на то, в чем заключается проблема, но пока эта попытка не принесла особых плодов.
К сожалению, мне не удалось воспроизвести эту проблему в своей лабораторной среде, поэтому я ограничен тем, что можно сделать на сайте заказчика.
Речь идет о Red Hat Enterprise 5.4 и SUSE 10 под управлением java версии 1.6.0_05-b13.
У кого-нибудь была эта проблема? Любые идеи о том, почему kill -3 не может создать дамп потока Java?
Спасибо!
Похоже, у вас не хватает места в куче.
Даже если ваша JVM не создает дамп потоков, вы должны иметь возможность сгенерировать дамп кучи. Это вместе со статистикой GC также даст вам представление о том, что происходит. Обратитесь к документации JVM, чтобы узнать, как создать дамп кучи в двоичном формате. Тогда скачайте Анализатор памяти и откройте файл дампа кучи, чтобы узнать, что занимает память. Как правило, можно использовать jmap
команду с соответствующими параметрами. Создание дампа кучи заставит вашу JVM немного замедлиться; Я видел, что создание дампа кучи размером 1,5 ГБ, YMMV, занимает 30 минут.
Кроме того, опубликуйте свои варианты java как с серверов, на которых он висит, так и работает нормально.
Создаются ли какие-либо файлы ядра при сбое JVM?
Вы также можете записать статистику GC в файл журнала. Это может предоставить дополнительную информацию о том, почему JVM зависает.
Существуют ли какие-либо другие JVM, использующие эту версию Java, работающую на этом компьютере? Мое первое предположение заключается в том, что с JRE что-то не так, и, возможно, ее необходимо переустановить.
Надеюсь, это поможет!
Том Перл
Ты пробовала jstack
или jvisualvm
?
Вы запускаете свой jvm (или контейнер с параметрами java) с переключателем -Xrs? Я думал, что эта опция командной строки помешает работе kill -3. Если это так, вы можете получить дамп потока с помощью jstack, если вы используете jvm 1.5 или выше.