Как мне выяснить причину сбоя JVM? - PullRequest
26 голосов
/ 16 ноября 2011

Однажды назад, после нескольких месяцев нормальной работы, наше java-приложение иногда зависает со следующей ошибкой:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (safepoint.cpp:247), pid=2075, tid=140042095163136
#  guarantee(PageArmed == 0) failed: invariant
#
# JRE version: 6.0_23-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.0-b09 mixed mode linux-amd64 compressed oops)
# An error report file with more information is saved as:
# /var/chat/jSocketer/build/hs_err_pid2075.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

Я заглянул в hs_err_pid2075.log и увидел, что существует активный поток, который обрабатывает сетевое соединение. Однако за последние несколько месяцев не было сделано никаких изменений приложений или среды. Также не было никакого роста нагрузки. Что я могу сделать, чтобы понять, что является причиной сбоя? Существуют ли какие-либо общие шаги для расследования аварии jvm?

UPD http://www.wuala.com/ubear/public

Ответы [ 5 ]

8 голосов
/ 16 ноября 2011

Сбой происходит в JVM, а не во внешнем собственном коде. Однако операция, в которой произошел сбой, была инициирована и внешней DLL.

Эта строка в файле hs_err_pid объясняет операцию, которая потерпела крах:

VM_Operation (0x00007f5e16e35450): GetAllStackTraces, mode: safepoint, requested by thread 0x0000000040796000

Теперь поток 0x0000000040796000 равен

0x0000000040796000 JavaThread "YJPAgent-Telemetry" daemon [_thread_blocked, id=2115, stack(0x00007f5e16d36000,0x00007f5e16e37000)]

, который является темой, созданной Yourkit. «GetAllStackTraces» - это то, что профилировщик должен вызывать для выполнения выборки. Если вы удалите профилировщик, сбой не произойдет.

С этой информацией невозможно определить причину сбоя, но вы можете попробовать следующее: Удалите все параметры -XX VM, -verbose: gc и параметры отладочной виртуальной машины. Они могут мешать профилированию интерфейса JVM.

Обновление

Код, который вызывает java.lang.Thread#getAllStackTraces() или java.lang.Thread#getStackTrace(), может вызвать тот же сбой

5 голосов
/ 16 ноября 2011

Два раза я был свидетелем повторяющихся сбоев JVM, оба из-за аппаратного сбоя, а именно ОЗУ.Запуск memtest - это первое, что я попробую.

2 голосов
/ 16 ноября 2011

Из отчета об ошибке видно, что у вас загружен агент YourKit . Его телеметрический поток упоминается как инициатор операции, которая, по-видимому, завершается с ошибкой. Попробуйте запустить приложение без агента YJP , чтобы проверить, можно ли по-прежнему воспроизводить сбой.

Как правило, сбои JVM довольно сложно диагностировать. Они могут произойти из-за ошибки в некотором коде JNI или в самой JRE. Если вы подозреваете последнее, возможно, стоит отправить отчет об ошибке в Oracle.

В любом случае, я бы рекомендовал обновить до последней версии Java 6 , чтобы убедиться, что это не известная проблема, которая уже была устранена. На момент написания этой статьи текущим выпуском является обновление 6 Java 29.

1 голос
/ 30 марта 2014

Переключение на другую версию linux-kernel "исправляет" проблему дробления JVM (http://forum.proxmox.com/threads/6998-Best-strategy-to-handle-strange-JVM-errors-inside-VPS?p=40286#post40286).. Это помогло мне с моим настоящим сервером. На нем была ОС Ubuntu server 10.04 LTS с версией ядра 2.6.32-33Обновление ядра решило эту проблему. У JVM больше нет сбоев.

1 голос
/ 16 ноября 2011

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

Если он работал целую вечность и теперь начал падать, то мне кажется, что аппаратная проблема является наиболее вероятной из двух. Можете ли вы запустить его на другом компьютере, чтобы исключить проблему? Конечно, точно также не помешает перейти на последнее обновление Java.

...