JVM崩溃..如何获取错误日志或核心转储

Posted

技术标签:

【中文标题】JVM崩溃..如何获取错误日志或核心转储【英文标题】:JVM crash.. How to get err log or core dump 【发布时间】:2019-12-10 12:38:47 【问题描述】:

我有一个使用 jna 调用本机 dll 的 java 应用程序。执行我在 java 中的回调后,程序在中间崩溃了 JVM,并抛出“java 平台 se 二进制已停止”对话框。 java控制台日志没有用,那里什么都没有。如何在 Windows 中获取核心转储或其他一些有用的日志,以找出问题及其原因。在 temp 文件夹中查找 hs_err 日志但找不到。

【问题讨论】:

【参考方案1】:

自从过去几天在我们的 RHEL 平台上运行 JVM (openjdk 8) 时,我们一直看到此错误。我们注意到它在 /var/log/message 文件中生成了一些错误消息,其中写入了 core_dump 文件的位置,如下所示。

2020-01-29T03:08:14.980998+00:00 lon6pvlpdgrd103 abrt[2274]:已保存 pid 40132 的核心转储 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10- 0.el6_10.x86_64/jre/bin/java) 到 /var/spool/abrt/ccpp-2020-01-29-03:08:10-40132 (1048576000 字节)

我认为它的操作系统级别的功能是在进程异常崩溃时生成核心转储。 此页面有助于进一步了解崩溃的原因:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/crashes001.html 对于 Windows,请参阅上面文章的第 17.4.4 节在 Windows 表单上收集故障转储。 请检查这是否有帮助。

【讨论】:

【参考方案2】:

hs_err 文件通常写在 JVM 进程的“当前目录”中。如果用户不可写该目录,则该文件将被写入临时目录。您还可以告诉 JVM 将致命错误报告写入指定文件。

仅当“核心文件大小”ulimit(或等效项)足够大并且它们的文件空间足够时,才会写入核心转储。默认 ulimit 为零。

更多信息:

Location of Fatal Error Log Collect Core Dumps

【讨论】:

【参考方案3】:

使用-XX:ErrorFile 指定错误文件。

来自Location of Fatal Error Log:

要指定创建日志文件的位置,请使用产品标志 -XX:ErrorFile=file,其中 file 表示日志文件位置的完整路径。

还有,这个:

如果未指定 -XX:ErrorFile=file 标志,则默认日志文件名为 hs_err_pid.log,其中 pid 是进程的 PID。

【讨论】:

以上是关于JVM崩溃..如何获取错误日志或核心转储的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Java.exe/jvm.dll 的符号文件以分析崩溃核心转储文件?

Linux 上的核心转储文件:如何获取打开文件的信息?

如果应用程序在 GC 中,如何可靠地获取 JVM 核心转储?

使用 Serviceability Agent 检查 JVM 核心转储时如何获取共享库列表?

如何让android打印掉崩溃系统应用程序的核心转储?

如何分析来自 Java 核心转储的信息? [关闭]