首页 > Java > 如何让 JVM 在 SIGSEGV 崩溃后快速退出?

如何让 JVM 在 SIGSEGV 崩溃后快速退出?

WBOY
发布: 2024-02-09 19:09:09
转载
1078 人浏览过

php小编西瓜为你解答,当 JVM 在遇到 SIGSEGV 崩溃时,可以采取一些措施来快速退出。首先,可以通过设置 JVM 参数 -XX:+CrashOnOutOfMemoryError 来使 JVM 在内存溢出时崩溃并快速退出。其次,可以使用 Java 的异常处理机制来捕获 SIGSEGV 异常,并在捕获到异常后调用 System.exit() 方法来退出程序。此外,还可以使用 JNI 接口来与操作系统进行交互,通过调用操作系统提供的退出方法来实现快速退出。总之,通过合理设置 JVM 参数和使用适当的异常处理机制,可以让 JVM 在 SIGSEGV 崩溃后快速退出,提高程序的稳定性和可靠性。

问题内容

我们的一项服务由于 tensorflow java 的某些问题而经常崩溃。我们可以接受(k8s 会重新启动它,很多实例)。问题是 jvm 需要几分钟才能终止。有没有办法在本机代码中强制快速退出 sigsegv?

corrupted size vs. prev_size while consolidating
#
# a fatal error has been detected by the java runtime environment:
#
#  sigsegv (0xb) at pc=0x00007fe4f321a898, pid=1, tid=545
#
# jre version: openjdk runtime environment zulu21.28+85-ca (21.0+35) (build 21+35)
# java vm: openjdk 64-bit server vm zulu21.28+85-ca (21+35, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# problematic frame:
# c  [libc.so.6+0x28898]  abort+0x178
#
# core dump will be written. default location: /data/core
#
# an error report file with more information is saved as:
# /data/hs_err_pid1.log
登录后复制

几分钟后:

# [ timer expired, abort... ]
[thread 1037 also had an error]
登录后复制

解决方法

添加以下 jvm 选项:

-xx:+suppressfatalerrormessage -xx:-createcoredumponcrash
登录后复制

这将强制 jvm 在 sigsegv 上立即终止,而不创建错误报告或核心转储。如果您仍然想看到致命错误消息,请将 -xx:+suppressfatalerrormessage 替换为 -xx:errorlogtimeout=1

我怀疑这个 jvm 正在运行一个相当大的堆 (> 64 gb),并且对于使用如此多内存的进程来说,写出核心转储文件只需要一段时间:

# Core dump will be written. Default location: /data/core
登录后复制

在这需要的几分钟内,您可能会看到核心转储文件在上述位置不断增长(这将是确认这一理论的简单方法)。

补救措施是禁用核心转储文件的创建,其详细信息取决于您的特定操作系统(但几乎可以在任何基于 unix 的操作系统上禁用核心转储)。 此外,该特定位置可能存在一些与文件系统相关的瓶颈,导致核心转储的写入速度比预期慢。

以上是如何让 JVM 在 SIGSEGV 崩溃后快速退出?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板