Мое Java-приложение начало регулярно аварийно завершать работу с SIGSEGV и дампом стековых данных и загрузкой информации в текстовом файле.
Я отлаживал программы на C в gdb, и я отлаживал код Java из своей IDE. Я не уверен, как подходить к C-подобным сбоям в работающей Java-программе.
Я предполагаю, что я не смотрю на ошибку JVM здесь. Другие программы на Java работают просто отлично, и JVM от Sun, вероятно, более стабильна, чем мой код. Тем не менее, я понятия не имею, как я мог вызвать segfaults с кодом Java. Там определенно достаточно свободной памяти, и когда я последний раз проверял в профилировщике, использование кучи составляло около 50%, а случайные скачки - около 80%. Есть ли параметры запуска, которые я мог бы исследовать? Что такое хороший контрольный список при обнаружении такой ошибки?
Несмотря на то, что я пока не могу надежно воспроизвести событие, оно, похоже, тоже не происходит совершенно случайно, поэтому тестирование не является полностью невозможным.
ETA: некоторые кровавые детали
(Я ищу общий подход, поскольку реальная проблема может быть очень конкретной. Тем не менее, есть некоторая информация, которую я уже собрал, и она может иметь некоторое значение.)
Некоторое время назад у меня возникли похожие проблемы после обновления моего CI-сервера (подробнее см. здесь ), но это исправление (настройка -XX:MaxPermSize
) на этот раз не помогло.
Дальнейшее расследование показало, что в файлах журнала сбоев поток, помеченный как «текущий поток», никогда не принадлежит моему, но либо с именем «VMThread», либо с именем «GCTaskThread» - если он последний, он дополнительно помечен с комментарием «(выход)», если он первый, GCTaskThread отсутствует в списке. Это заставляет меня предположить, что проблема может быть в конце операции GC.