Java VM:在 1.6.0_17 和 1.6.0_18 上均可重现 SIGSEGV,如何报告?

2024-01-20

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

首先请注意,这与以下内容有点相关但不完全相同,因为在我们的例子中,它只发生一个 SIGSEGV,并且我们可以可靠地触发它:

JVM OutOfMemory 错误“死亡螺旋”(不是内存泄漏) https://stackoverflow.com/questions/2297920/jvm-outofmemory-error-death-spiral-not-memory-leak

这是相关的,因为当我们向应用程序提供“大量数据”时,就会发生这种情况:数据来自文本文件,然后进行数字运算(是的,Java 中的财务数字运算)。

我可以仅使用有效的 Java 代码可靠地将 JVM 触发到 SIGSEGV。

NOTE:我总是会导致 JVM 1.6.0_17 和 JVM 1.6.0_18 崩溃,这个问题不是关于如何解决这个问题(例如使用 VM 参数)may解决问题,但我不在那之后,我想知道如何处理这个总是可重现的 SIGSEGV)。

我有一个解决方法,它只是在启动我们的应用程序时使用 Java 1.5(同时仍然使用 Java 1.6 在同一台计算机上同时运行 IntelliJ IDEA 等),但我的问题是是否应该报告这一点,并且,如果应该,如何报告它知道日志本身包含专有信息(完整的 hs_err_..._log)。

可以排除硬件错误:

  • 这种情况发生在一台经常达到数月正常运行时间的工作站上(我只会在影响我的精简和强化的 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

(请注意,行“[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 社区”来说是好事还是我不应该打扰,因为它不重要?


我在升级到 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"

and not

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

所以可能 JVM 无法写入堆转储,我们只能得到 SIGSEGV(以前的版本在工作目录中写入堆转储)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java VM:在 1.6.0_17 和 1.6.0_18 上均可重现 SIGSEGV,如何报告? 的相关文章

  • 我在socket上设置了超时,发现这个值不能大于21

    我在socket上设置了超时 该值小于21秒才有效 21秒后发现超时还是21秒 public static void main String args SimpleDateFormat sdf new SimpleDateFormat yy
  • Jackson - 反序列化嵌套 JSON

    我有一个 JSON 字符串 其格式如下 response execution status ready report cache hit true created on 2013 07 29 08 42 42 fact cache erro
  • 如何向开发人员发送崩溃报告?

    我开发 Android 应用程序 但在某些情况下我的应用程序force close 如果出现以下情况 我如何向开发人员发送包含详细信息的电子邮件force close随时发生 The ACRA https github com ACRA a
  • 使用 Java 在 WebDriver 中按 Ctrl+F5 刷新浏览器

    我已经使用 java 刷新了 WebDriver 中的浏览器 代码如下 driver navigate refresh 如何使用 Java 在 WebDriver 中按 Ctrl F5 来做到这一点 我认为您可以使用 WebDriver 和
  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • 在哪里可以获得有关 Java FitNesse 和 Slim 的一些教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何开始使用 Chainsaw for Log4j?

    我想开始使用 Chainsaw v2 几乎没有关于它的信息 我只找到了this http www velocityreviews com forums t140105 help using chainsaw for log4j html 但
  • 无法使用 json 架构验证器根据预定义的 yaml 文件验证查询参数

    我需要根据预定义的 yaml 文件架构验证查询参数的架构 因此我使用 json 架构验证器 验证如何失败 我正在执行以下步骤 填充参数和相应的架构 final List
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • Java中的回调接口是什么?

    SetObserver 接口的代码片段取自有效的Java 避免过度同步第67条 public interface SetObserver
  • 对于当前月份和日期但年份不同的日期,经过的月份计算未给出正确的结果

    我正在尝试计算自特定日期以来经过的月份 该函数工作正常 尽管如果我将今天的日期与过去的不同年份放在一起 它会给我一个月的差异 不到一个月 假设对于所有日期 该函数都运行良好 除了 如果今天是 2014 03 06 YYYY MM DD 并且
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分

随机推荐

  • 如何更改选项卡栏项目的默认灰色?

    我尝试更改默认的灰色Tab Bar项目 但 Xcode 发现错误 我使用了一些代码 该代码是 import UIKit extension UIImage func makeImageWithColorAndSize color UICol
  • paypal 10544 网关拒绝错误的原因

    您好 请告诉我 paypal DoDirectPayment 10544 Gateway Decline 错误的可能原因 我查了很多资料都找不到原因 首先是强制性的 愚蠢的人类把戏 问题 您确定您使用的卡是有效的信用卡吗 如果您在现场 而不
  • 捕获 stdout 和 stderr 到管道

    我想从子进程中读取 stderr 和 stdout 但它不起作用 main rs use std process Command Stdio use std io BufRead BufReader fn main let mut chil
  • 如何更改 git 历史记录中的文件路径?

    这是我所拥有的 我的代码的 git 存储库 projects proj1 no git repo here yet subproj1 lt current git repo here 这就是我想要的 一个 git 存储库 它现在正在跟踪使用
  • 显示 R 中函数的源代码[重复]

    这个问题在这里已经有答案了 我可以用lm or class knn查看源代码 但我未能显示 princomp 的代码 这个函数 或其他东西 是用 R 编写的还是使用了其他字节码 我也无法使用来自的建议找到源代码如何显示包中 S4 函数的源代
  • 理解 `k : Nat ** 5 * k = n` 签名

    以下函数编译 onlyModByFive n Nat gt k Nat 5 k n gt Nat onlyModByFive n k 100 但有什么作用k以其代表Nat 5 k n syntax 另外 我该如何称呼它 这是我尝试过的 但我
  • 如何读取 web.config 文件中的 appSettings 部分?

    我的 XML 看起来像这样 文件名是web config
  • “cl”未被识别为内部或外部命令

    下面是我在 windows7 中运行 scons 编译器时的错误消息 cl is not recognized as an internal or external command operable program or batch fil
  • 使用 diff 手动合并两个文件

    我想通过执行以下操作来合并两个文件 将两个文件的差异输出到临时文件中并 手动选择我想要复制 保存的行 这里的问题是diff u只给我一个文件行的上下文 而我想以统一的格式输出整个文件 有什么办法可以做到这一点吗 一种可能适合您的选择 sdi
  • 创建反应应用程序,重新加载不起作用

    我刚刚开始使用 React 进行编码创建反应应用程序 https github com facebookincubator create react app 在文档中说 如果您进行编辑 页面将重新加载 我不知道哪个模块负责自动重新加载 we
  • Textarea charCount - 防止用户粘贴

    下面的代码工作正常 只是如果我粘贴一个超过 10 个字符的字符串 它应该只粘贴前 10 个字符 目前还没有这样做 如何防止粘贴超过 10 个字符 http jsfiddle net qfzkw 2 http jsfiddle net qfz
  • 数组大小和复制性能

    我确信这个问题之前已经得到了回答 但我找不到一个好的解释 我正在编写一个图形程序 其中管道的一部分将体素数据复制到 OpenCL 页面锁定 固定 内存 我发现这个复制过程是一个瓶颈 并对一个简单的性能进行了一些测量std copy 数据是浮
  • 在 java 7 上使用 JNI 运行 java 5/6 会出现堆栈保护警告

    使用 1 5 或启用 1 5 比较模式的 1 6 构建的 java 程序会给出以下警告 Java HotSpot TM 服务器 VM 警告 您已加载库 mynativelib so 可能禁用了堆栈保护 虚拟机现在将尝试修复堆栈防护 强烈建议
  • 如何使用 git diff 显示一些不可见的字符差异?

    当我使用git diff 我看到了如下差异 self conv 2 nn Conv2d C in C out 2 1 stride 2 padding 0 bias False self conv 2 nn Conv2d C in C ou
  • 来自多个进程的 Python 日志记录

    我有一个可能长时间运行的程序 当前有 4 个进程 但可以配置为有更多进程 我研究过从多个进程记录 http docs python org howto logging cookbook html logging to a single fi
  • 如何修复 IE 渲染 border-radius 与 box-shadow 结合的问题?

    有人知道如何 修复 IE 9 和 10 中 box shadow 和 border radius 组合的渲染吗 使用嵌入阴影时尤其明显 与 webkit gecko 相比 IE 中阴影的半径有很大不同 在此图中您可以看到问题 左边是一个带有
  • 如何使 Eclipse 输出 std:out 到标准 Windows 控制台

    正如 Eclipse 用户所知 Eclipse 默认捕获 std out 和 err 的输出 并将其转储到与 IDE 集成的控制台中 我希望 Eclipse 默认情况下仅使用标准 Windows cmd 实例来显示 std out 和 st
  • Git 的“替代机制”是什么?

    我正在学习通过man gitglossary 而这个术语一直让我困惑 因为术语表中根本没有定义它 它仅被引用两次 添加星号 alternate object database Via the alternates mechanism a r
  • 从 IP 块计算网络掩码/网关

    我们的数据中心为我们提供了所有机器的 JSON 转储 以便导入到我们自己的库存管理系统中 这提供了 IP 块 例如 192 168 1 1 26 但当我导入数百个块时 我还想计算网络掩码和网关 我查看了 PHP Doxygen 上的网络功能
  • Java VM:在 1.6.0_17 和 1.6.0_18 上均可重现 SIGSEGV,如何报告?

    EDIT 这种可重现的 SIGSEGV 发生在一台具有多个 proc 和超过 2GB 内存的 Linux 机器上 因此 Java 默认为 server 模式 有趣的是 如果我强制 client 就不会再崩溃了 我仍然不太确定如何处理我的可重