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 的操作系统上禁用核心转储)。 此外,该特定位置可能存在一些与文件系统相关的瓶颈,导致核心转储的写入速度比预期慢。
Atas ialah kandungan terperinci Bagaimana untuk membuat JVM keluar dengan cepat selepas kemalangan SIGSEGV?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!