2009-03-01 9 views
6

Я довольно давно использую оболочку службы Java в пользовательском приложении, и она работает нормально. Начиная с обновления нашего приложения до новой версии за последние несколько дней JVM начал висит, а затем обертка печатает это в журнале: JVM появляется зависанием: время ожидания сигнала от JVM.Java появляется под вихрем

Затем он автоматически завершает работу JVM и снова запускает приложение. Это происходит примерно через 10 часов работы, что затрудняет отладку.

Конечно, я собираюсь ознакомиться с изменениями, которые мы сделали, но никаких серьезных изменений, которые, как я подозревал, не вызвали бы этот тип проблемы.

Где я могу попытаться выяснить, что происходит? Отладочные сообщения из приложения не указывают ничего интересного. Если JVM просто падает, обычно создается дамп, который может помочь в его отладке, но он висит, поэтому он не создает дамп. Если я заставляю его не перезапускать службу автоматически, есть ли что-нибудь, что я могу сделать, чтобы получить полезную информацию из JVM перед ее перезагрузкой?

Мне кажется, что JVM не должен зависать от типичных ошибок программирования. С чем вы столкнулись раньше, это может привести к зависанию JVM?

ответ

1

У меня было несколько разных версий библиотеки на пути к классам (JBPM). С помощью обертки вы можете использовать подстановочные знаки для включения банок. Будьте осторожны с этим, хотя, как вы можете случайно включить больше, чем вы должны.

Настоящая статья IBM содержит информацию о debugging hangs in Java. Это в основном говорит, что есть две вещи, которые могут вызвать зависание:

  1. бесконечного цикла,
  2. Тупик.

С тех пор мне пришлось отлаживать другие проблемы с подвеской. В linux вы можете отправить JVM сигнал QUIT, чтобы сделать дамп потока на консоль. Это действительно помогает выяснить, где проблема. Используйте эту команду, чтобы сделать это: убить -QUIT

Редактировать 6/13/2017

В эти дни я использую jmap включены в JDK, чтобы сбросить всю память программы. Затем я использую Eclipse Memory Analyzer, чтобы увидеть точное состояние программы, когда она разбилась. Вы можете посмотреть список активных потоков, а затем проверить переменные в каждом стеке стека.

/usr/java/latest/bin/jmap -dump:file=/tmp/app-crash.hprof <PID> 

Где PID - это идентификатор процесса java-процесса.

1

В какое время вы жили? ОС, версия JVM, аппаратная архитектура?

Это звучит как ошибка, и, учитывая, что это занимает много часов, это звучит как ошибка истощения ресурсов.

+0

Linux RHEL4, Java 1.6.0, Intel 32 бит. Я отслеживаю количество потоков и использование памяти; пока он не использует большую часть. Мы не используем много потоков. Мы просто запускаем несколько минут при запуске приложения, чтобы посмотреть каждые несколько минут, чтобы увидеть, есть ли что-то для обработки. –

+0

Насколько последовательны 10 часов? На самом деле существует только пара возможностей: либо * некоторая * истощение ресурсов, либо случайный тупик/задержка. Какое приложение? –

+0

Совсем несовместимо. Пока это происходит только три раза. На самом деле это похоже на то, что среднее значение немного выше 10 часов. Это произошло в 12, 14 и 19 часов. То, что я собираюсь сделать, это установить его не на автоматический перезапуск, чтобы я мог немного исследовать состояние, когда это произойдет. –

8

Читайте также на странице wrapper.ping.timeout property. Программное обеспечение обертки постоянно связывается с вашей JVM, чтобы убедиться, что оно живое. Если это сообщение не удается по какой-либо причине, оболочка считает, что процесс зависает и пытается его перезапустить.

В зависимости от того, как ваше приложение будет архивировано, ваша JVM может быть занята обработкой чего-то еще, когда обертка пытается «ping».

+0

Увеличение свойства может привести к тому, что оболочка не заметит проблему и не перезапустит приложение, но это всего лишь обход проблемы. В то время, когда он висит, он не будет отвечать на запросы клиентов, что тоже плохо. –

2

Посмотрите, можете ли вы использовать Visual VM, чтобы узнать, что произойдет. Визуальная виртуальная машина контролирует приложение в течение всего времени, и когда он перестает работать, возможно, вы можете определить, что не так.

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

(Edit на основе комментариев)

Пробовал это. В последний раз он повесил количество потоков и количество используемой памяти было довольно низким, поэтому ни одна из них не вызывает проблему . К сожалению, после того, как он зависает , и обертка завершает его, вы не можете получить свалку потока.

Есть ли способ запустить его без оболочки для его отладки? Также, если вы используете профилировщик NetBeans, он может дать вам возможность справиться с ним, когда он остановится (я проверю позже сегодня и посмотрю, смогу ли я узнать, будет ли это вести себя по-другому).

+0

Пробовал это. В последний раз, когда он зависел от количества потоков, и объем используемой памяти был довольно низким, поэтому ни одна из них не вызывает проблемы. К сожалению, после того, как он зависает, и оболочка завершает его, вы не можете получить дамп потока. –