Назад | Перейти на главную страницу

Зависание Java JVM не отвечает на kill -3

У меня есть виртуальная машина 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 или выше.