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, чтобы сообщить о такой проблеме, или я просто не должен беспокоиться, потому что это не важно?