Java VM: воспроизводимый SIGSEGV на 1.6.0_17 и 1.6.0_18, как сообщить? - PullRequest
11 голосов
/ 19 февраля 2010

РЕДАКТИРОВАТЬ : Этот воспроизводимый SIGSEGV происходит на машине Linux с более чем одной процедурой и более 2 ГБ памяти, поэтому Java по умолчанию работает в режиме -server. Интересно, что если я заставлю «-клиента» больше не произойти сбой ... (Я все еще не совсем уверен, что делать с моим воспроизводимым SIGSEGV, но, тем не менее, это интересно).

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

Ошибка JVM OutOfMemory «спираль смерти» (не утечка памяти)

Это связано с тем, что это происходит, когда мы наполняем наше приложение «потоком данных»: данные поступают из текстовых файлов, а затем обрабатываются по номерам (да, финансовые цифры в Java).

Я могу надежно запустить JVM для SIGSEGV, используя только действительный код Java.

ПРИМЕЧАНИЕ : я могу неизменно вызывать сбой как JVM 1.6.0_17, так и JVM 1.6.0_18, и этот вопрос не о том, как обойти эту проблему (например, при игре с параметрами VM может исправить проблему, но я не после этого, я хочу знать, что делать с этим всегда воспроизводимым SIGSEGV).

У меня есть обходной путь, который просто заключается в использовании Java 1.5 при запуске нашего приложения (хотя все еще использую Java 1.6 для одновременного запуска IntelliJ IDEA и т. Д. На одной и той же машине), но мой вопрос заключается в том, следует ли об этом сообщать или нет, и, если нужно, как сообщить об этом, зная, что сам журнал содержит конфиденциальную информацию (полный журнал hs_err _..._).

Аппаратная ошибка может быть исключена для:

  • это происходит на рабочей станции, которая регулярно достигает месяцев безотказной работы (я перезагружаю ее только тогда, когда выпускаются критические исправления безопасности, затрагивающие мой урезанный и усиленный Debian Linux, что на самом деле не часто), и на каких приложениях никогда не вылетает (очень маловероятно, что это аппаратная проблема на этом компьютере [подробнее ниже])

  • одно и то же приложение отлично работает на той же машине под JVM 1.5 под той же нагрузкой (вот как я тестирую приложение: я просто запускаю его под 1,5 ВМ)

  • одно и то же приложение прекрасно работает на более чем сотне клиентских компьютеров при одной и той же (гигантской) нагрузке (ни разу не падал в Windows + JVM 1.5 или 1.6 и ни разу не падал в OS X + JVM 1.5 или 1.6 [a сбой будет означать мгновенный звонок от клиента])

  • другие приложения на той же машине и той же JVM 1.6.0_17 или 1.6.0_18 никогда не аварийно завершаются (например, у меня есть два экземпляра IntelliJ IDEA, работающих как два разных пользователя на той же машине, и они не авария)

  • машина тестируется с помощью memtest "регулярно" (перед установкой новой ОС, что произошло в последний раз, когда я установил Debian Lenny, не так давно)

Вот воспроизводимый по запросу SIGSEGV:

... $uname -a
Linux saturn 2.6.26-2-686 #1 SMP Wed Nov 4 20:45:37 UTC 2009 i686 GNU/Linux
... $ export /home/wizard/jdk1.6.0_17/bin:$PATH
... $ java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Server VM (build 14.3-b01, mixed mode)

Запустите приложение, подайте в него «поток данных», подождите несколько секунд ...

Тогда, неизменно, для 1.6.0_17:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0xb76d0080, pid=30793, tid=2514328464
#
# JRE version: 6.0_17-b04
# Java VM: Java HotSpot(TM) Server VM (14.3-b01 mixed mode linux-x86 )
# Problematic frame:
# V  [libjvm.so+0x4bc080]
#
# An error report file with more information is saved as:
# /home/wizard/hs_err_pid30793.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp

(обратите внимание, что строка '[libjvm.so + 0x4bc080]' соответствует 1.6.0_17 для каждого SIGSEGV)

или для 1.6.0_18:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0xb77468f0, pid=722, tid=2514516880
#
# JRE version: 6.0_18-b07
# Java VM: Java HotSpot(TM) Server VM (16.0-b13 mixed mode linux-x86 )
# Problematic frame:
# V  [libjvm.so+0x4d88f0]
#
# An error report file with more information is saved as:
# /home/wizard/hs_err_pid722.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#
Aborted

(обратите внимание, что строка "[libjvm.so + 0x4d88f0]" соответствует 1.6.0_18 для каждого SIGSEGV)

Проблема в том, что файл журнала содержит конфиденциальную информацию этим нельзя поделиться.

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

Обратите внимание, что одно и то же приложение, на том же оборудовании, с точно такой же JVM, но другой версией Linux (у меня был Debian Etch ранее), НЕ запускало этот SIGSEGV один раз.

Но это не означает, что JVM не виновата: это все еще может быть проблемой JVM.

Должен ли я сообщить об этом и как? (помните, что написание «воспроизводимого крошечного контрольного примера» является бредовым и что журнал содержит конфиденциальную информацию, которая не должна быть пропущена). Должен ли я просто отредактировать журнал и отправить его?

Какова процедура сообщения о таком воспроизводимом SIGSEGV, когда ваш журнал содержит конфиденциальную информацию и когда контрольный пример, воспроизводящий проблему, неосуществим?

Кто-нибудь из вас успешно открыл такую ​​ошибку и затем увидел, что она исправлена ​​в следующем выпуске Java?

Как вы думаете, это хорошо "для сообщества Java" сообщать о такой проблеме, или я просто не должен беспокоиться, потому что это не важно?

Ответы [ 4 ]

6 голосов
/ 25 февраля 2010

У меня возникла аналогичная проблема при обновлении до JDK 1.6_18, и она, кажется, решена с использованием следующих параметров:

-server
-Xms256m
-Xmx748m
-XX:MaxPermSize=128m

-verbose:gc
-XX:+PrintGCTimeStamps
-Xloggc:/tmp/gc.log
-XX:+PrintHeapAtGC
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath="/tmp"

-XX:+UseParallelGC
-XX:-UseGCOverheadLimit

# Following options just to remote monitoring with jconsole, useful to see JVM behaviour at runtime
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=MyHost

Я все еще не проверял дважды (это производственная среда), но я думаю, что ошибкабыло вызвано двумя причинами:

1) Неправильная настройка для кучи и / или постоянного пространства (я думаю, JDK 1.6 требует больше места в куче и постоянном, чем в предыдущих версиях JVM), что вызвало ошибку OutOfMemoryError, но

2) в неправильной исходной настройке кто-то написал

-XX:+HeapDumpOnOutOfMemoryError="/tmp"

, а не

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath="/tmp"

, поэтому, вероятно, JVM не смогла написать heapdump, и мы получили только SIGSEGV (предыдущие версии писали heapдамп в рабочем каталоге).

Также проверьте опции -server -XX:+UseParallelGC -XX:-UseGCOverheadLimit.Я думаю, что игра с параметрами виртуальной машины - это не обходной путь, но правильный подход также потому, что сборщик мусора (и не только) изменился между 1,5 и 1,6.

5 голосов
/ 19 февраля 2010

Проблема в том, что файл журнала содержит конфиденциальную информацию, которой нельзя поделиться.Воспроизведение «крошечного контрольного примера», воспроизводящего проблему, также нереалистично

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

Должен ли я сообщить об этом и как?

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

Обратите внимание, что точно такое же приложение, на том же оборудовании, с точно такой же JVM, но другой версией Linux (У меня был Debian Etch ранее) НЕ запускал этот SIGSEGV один раз.

Работает ли он на другом компьютере с тем же оборудованием и той же версией Linux?

1 голос
/ 20 февраля 2010

Если это поможет, ссылка на сообщение об ошибке в отчете о сбое содержит следующее заявление об отказе:

Кроме того, Sun Microsystems уважает ваше стремление к конфиденциальности.Личные данные, собранные в рамках этой программы, не будут продаваться, передаваться или передаваться сторонним организациям.Мы будем использовать эти данные для связи с вами для выяснения вопросов, касающихся отправленного вами отчета и / или статуса этого отчета.О проблемах, о которых вы сообщаете, могут быть предоставлены другим членам JDC или клиентам Sun, однако ваши личные данные будут храниться в тайне.Если вам не подходят указанные выше условия, не нажимайте кнопку «Отправить».Если у вас есть какие-либо вопросы, пожалуйста, обратитесь к нашей Политике конфиденциальности .

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

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

0 голосов
/ 20 февраля 2010

Самый первый вопрос, который вы должны задать себе:

  • Использую ли я официально поддерживаемый дистрибутив Linux?

Если нет, переключитесь на тот, который есть.

Если да, то доложи об этом Солнцу!

...