Процесс Java зависает без видимой причины - PullRequest
5 голосов
/ 07 декабря 2010

Я запускаю процесс Java с Xmx2000m, хост-операционная система - linux centos, jdk 1.6 update 22. В последнее время я наблюдаю странное поведение в этом процессе, оно становится полностью не отвечающим без видимой причины, без журналов, без ошибок , ничего .. Я использую jconsole для мониторинга процессора, куча и пермская память не заполнены, потоки и загруженные классы не протекают .. Кто-нибудь объяснение?

Ответы [ 7 ]

6 голосов
/ 07 декабря 2010

Я сомневаюсь, что кто-то может дать вам объяснение, поскольку существует множество возможных причин и недостаточно информации.Однако я предлагаю вам jstack процесс, как только он зависнет, чтобы выяснить, что делают потоки, и взять его оттуда.Звучит как тупик или избиение какого-то рода.

4 голосов
/ 07 декабря 2010

сделать дамп потока. Если у вас есть доступ к процессу переднего плана в Linux, используйте ctrl-\. Или используйте jstack для удаленного сброса стека. Или вы можете на самом деле проткнуть его через JMX через jconsole на MBeans/java.lang/Threading/Operations/dumpAllThreads.

Не зная больше о вашем приложении, трудно рассуждать о причине. Предположительно, ваши темы либо а) заблокированы, либо б) закрыты. Если они заблокированы, они могут ожидать ввода-вывода в базе данных или другой операции ИЛИ они могут ожидать блокировки или монитора (заблокированы). Если существует взаимоблокировка, дамп потока сообщит вам, какие потоки заблокированы, какая блокировка, и (в Java 6) аннотирует стек, где были приняты блокировки. Вы также можете искать взаимоблокировки с помощью метода JMX, доступного через jconsole по адресу MBeans/java.lang/Threading/Operations/find[Monitor]DeadlockedThreads().

Или ваши темы могли получить необработанные исключения и выйти. Проверьте поток uncaughtExceptionHandlers или (лучше) использовать Executors в java.util.concurrent.

И, наконец, другим классическим источником пауз в Java является GC. Запустите с -verbose: gc и другими флагами GC, чтобы увидеть, выполняет ли он полную коллекцию GC. Вы также можете включить это динамически в jconsole, щелкнув флаг на MBeans/java.lang/Memory/Attributes/Verbose.

2 голосов
/ 07 декабря 2010

Согласен с aix, но хотел бы добавить пару рекомендаций.1. проверьте свою систему.Запустите top, чтобы увидеть, исправна ли сама система, процессор не на 100% и доступна памятьЕсли нет, то исправьте это.2. приложение может зависнуть в результате блокировки.Проверьте это.

1 голос
/ 16 декабря 2010

Хорошо, вот некоторые обновления, которыми я хотел бы поделиться:

Существует несовместимость между NTPL (новой библиотекой потоков Linux) и Java 1.6+ JVM.Случайная ошибка приводит к зависанию JVM и 100% -ной загрузке процессора.

Чтобы обойти эту проблему, установите LD_ASSUME_KERNEL = 2.4.1 перед запуском JVM, экспортируйте LD_ASSUME_KERMEL = 2.4.1.Это отключает NTPL: проблема решена!

Но по соображениям совместимости я все еще ищу решение, которое использует NTPL.

0 голосов
/ 07 декабря 2010

Проверьте jvisualvm процесса прямо перед сбоем.http://www.jadyounan.com/wp-content/uploads/2010/12/process.png

0 голосов
/ 07 декабря 2010

Не могли бы вы подробнее рассказать о том, что вы делаете? 2000 для памяти довольно много.

0 голосов
/ 07 декабря 2010

Потоки можно отследить с помощью jvisualvm и jconsole, также можно избежать взаимных блокировок. Обратите внимание, что существует несколько сетевых служб, каждый из которых имеет отдельные пулы потоков, и все они становятся недоступными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...