Подтвердить что ты не робот

Java VM: воспроизводимый SIGSEGV на 1.6.0_17 и 1.6.0_18, как сообщить?

EDIT. Этот воспроизводимый 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 VM)

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

  • другое приложение на том же компьютере и тот же 1.6.0_17 или 1.6.0_18 JVM никогда не сбой (например, у меня есть два экземпляра 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, чтобы сообщить о такой проблеме, или я просто не должен беспокоиться, потому что это не важно?

4b9b3361

Ответ 1

У меня была аналогичная проблема с обновлением до 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 (предыдущие версии писали кучу дампа в рабочем каталоге).

Также проверьте параметры -server -XX:+UseParallelGC -XX:-UseGCOverheadLimit. Я думаю, что игра с параметрами VM не является обходным путем, но правильный подход также объясняется тем, что сборщик мусора (и не только) менялся между 1.5 и 1.6.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Если нет, переключитесь на один из них.

Если вы, сообщите об этом Sun!