问题 Java VM:1.6.0_17和1.6.0_18都可以重现SIGSEGV,如何报告?


编辑:这个可重现的SIGSEGV发生在具有多个proc和超过2GB内存的Linux机器上,因此Java默认为-server模式。有趣的是,如果我强迫“-client”再也没有崩溃......(我仍然不太确定如何处理我可重复的SIGSEGV,但它仍然很有趣)。

首先请注意,这与以下内容有点相关但不同,因为在我们的情况下,它只发生了一个SIGSEGV,我们可以可靠地触发它:

JVM OutOfMemory错误“死亡螺旋”(不是内存泄漏)

它是相关的,因为它发生在我们为应用程序提供“大量数据”时:数据来自文本文件然后数字嘎吱嘎吱(是的,Java中的财务数字运算)。

我只能使用有效的Java代码可靠地触发JVM到SIGSEGV。

注意:我总是会崩溃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上崩溃一次[崩溃意味着即时电话来自客户的电话])

  • 同一台机器上的其他应用程序和相同的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

(请注意,每个SIGSEGV的'[libjvm.so + 0x4bc080]'行与1.6.0_17一致)

或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]”行在每个SIGSEGV上都是1.6.0_18一致)

问题是日志文件包含专有信息 那是无法分享的。

再现一个重现问题的“微小测试用例”也是不现实的:它类似于上面链接的问题,这只发生在应用程序的“大量数据”时。

请注意,完全相同的应用程序,在完全相同的硬件上,具有完全相同的JVM但是另一个版本的Linux(我以前使用过Debian Etch)并没有触发SIGSEGV一次。

但这并不意味着JVM没有错:它仍然可能是JVM问题。

我应该报告这个以及如何报告? (请记住,编写“可重现的微小测试用例”是妄想,并且日志包含不应泄露的专有信息)。我应该只编辑日志并发送吗?

当您的日志包含专有信息以及重现问题的测试用例不切实可行时,报告此类可重现的SIGSEGV的过程是什么?

你有没有成功打开这样的bug然后看到它在随后的Java版本中解决了?

您是否认为报告此类问题对“Java社区”有好处,或者我不应该费心,因为它不重要?


10346
2018-02-19 20:12


起源

这仍然适用于最新版本的Java吗?还要考虑使用IBM Java或JRocket。 - Thorbjørn Ravn Andersen
@ThorbjørnRavnAndersen:今晚我会检查并在这里报告 - SyntaxT3rr0r
@ThorbjørnRavnAndersen:刚刚下载了JRE版本:6.0_25-b06。完全相同的崩溃: - / - SyntaxT3rr0r
和IBM Java?.. - Thorbjørn Ravn Andersen
此外,这是否发生在官方支持的Linux平台之一? - Thorbjørn Ravn Andersen


答案:


我有类似的问题升级到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(以前的版本在工作目录中写了堆dump)。

检查 -server -XX:+UseParallelGC -XX:-UseGCOverheadLimit 选项也是。我认为使用VM参数不是一种解决方法,但正确的方法也是因为垃圾收集器(而不仅仅是)在1.5和1.6之间变化。


6
2018-02-25 08:41



@glenti:+ 1,很酷,关于SO的第一个答案就是我的一个问题:)尝试了你建议的一切,但它仍在崩溃。没有OutOfMemoryError的迹象,我尝试使用显示内存使用情况的自定义JLabel。显然没有PermGen问题。 - SyntaxT3rr0r
@glenti:你的帖子让我思考......我正在使用一台具有多个proc和超过2GB内存的Linux机器,因此Java默认为-server模式。有趣的是,如果我强迫“-client”再也没有崩溃......(我仍然不太清楚如何处理我可重复的SIGSEGV,但它仍然很有趣) - SyntaxT3rr0r


问题是日志文件   包含专有信息   无法分享。再现一个“微小的   测试用例“重现问题   也不现实

如果您无法为Sun提供可重现的测试用例,他们甚至不会查看它。即使您提供了可用的测试用例,他们也会忽略它。 Sun的错误提交过程有很多不足之处。

我应该报告这个以及如何报告?

如果您无法想出可重现的测试用例,请不要打扰。如果他们无法重现这个问题,你期望他们做什么?

请注意完全相同的应用程序,   在完全相同的硬件上,用   完全相同的JVM,但另一个   Linux版本(我有Debian Etch   以前)没有触发   SIGSEGV一次。

它是否在具有相同硬件和相同版本Linux的不同盒子上工作?


5
2018-02-19 20:20



我相信购买支持可以让你获得更多的关注。多少,取决于您购买的水平。 - Thorbjørn Ravn Andersen
@Kevin:啊,该死的......我可以将我的hd转向另一个,因此尝试使用完全相同的Linux内核/配置和JVM来查看SIGSEGV是否也可以重现,但是你在那里写的内容非常令人沮丧。测试用例意味着要发送数百兆字节的数据。哦,如果它可以在任何硬件上重现,也许我应该发送硬盘或制作可以重现问题的可引导CD :)(我是半严重的)OpenJDK怎么样?如果我可以在OpenJDK 7下可靠地重现这一点,情况会有所不同吗? - SyntaxT3rr0r
@WizardOfOdds:你说日志文件中有专有信息。你能写一个解析器或什么来“平化”这些数据,然后将你的日志文件发送给Sun吗? - Valentin Rocher


如果有帮助,崩溃报告中的错误提交链接有此免责声明:

此外,Sun Microsystems尊重您对隐私的渴望。从本程序收集的个人数据不会出售,给予或与Sun外部的组织共享。我们将使用此数据与您进行通信,以澄清有关您提交的报告和/或该报告状态的问题。您报告的问题可能会提供给其他JDC会员或Sun客户,但您的个人数据将被保密。如果您对上述条件不满意,请不要按“提交”按钮。如果您有任何疑问,请参阅我们的 隐私政策

就个人而言,如果数据不是太敏感(也许数据可以在日志中屏蔽或混淆?),我会报告是否可以用日志移交有问题的代码段。

你不可能真正判断这个bug是否对其他人“重要”,除非你知道究竟是什么导致它。报告它可能是Sun工程师找出问题严重原因的第一步。


1
2018-02-20 03:21



@matt b:是的,正在考虑清除hs_err _...日志中的文件名。我会看看Proguarded版本是否也会触发崩溃,然后我甚至可以发送混淆的.jar +数据来重现问题。还是抓住了我的头。 - SyntaxT3rr0r


你应该问自己的第一个问题是:

  • 我使用官方支持的Linux发行版吗?

如果没有,请切换到。

如果是,请将其报告给Sun!


0
2018-02-19 23:39



@Throbjorn:由谁正式支持?太阳你的意思是?我正在使用有史以来最稳定的Linux发行版,很多人都讨厌,因为包含最新的哨声和哨声以及其他像我这样的人喜欢它总是很慢,因为它坚如磐石坚固:Debian :) - SyntaxT3rr0r
由生成您正在使用的JVM的实体提供支持。 Sun没有说他们的Java将在现有的任何Linux发行版上运行,但是他们说他们“支持”上面列出的发行版 java.sun.com/javase/6/webnotes/install/... (“支持”意味着甚至考虑收听bug报告)。 Debian不存在,但是Ubuntu是。改用它。 - Thorbjørn Ravn Andersen
@Throbjorn:哦,好吧,我明白你的意思了(也感谢链接)...说Ubuntu实际上是基于Debian的:) Debian是系统管理员最受尊敬的发行版,它为很多真实世界提供了强大的功能。服务器,我没有切换到任何其他Linux发行版;)那说问题不是SIGSEGV(因为我有解决方法)但是如何处理... :) - SyntaxT3rr0r