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