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中文网其他相关文章!