在 JNA 中使用保护模式后,更多 JVM 崩溃

Even more JVM crashes after using protected mode in JNA

我在 Apache Spark 集群(节点 运行 Linux (Oracle 6.7))上使用 JNA 4.2.1 与本机库进行交互。极少数情况下,我的 JVM 会因为本机库发送的 SIGSEGV 信号而崩溃,这会导致我的整个 spark 应用程序失败。

所以我想保护我的 JVM 不因此而崩溃,所以我研究了 JNA 的保护模式,它应该将本机信号转换为 JVM 异常:

所以我用

System.setProperty("jna.protected","true")
Native.setProtected(true)

在我使用

加载库之前
Native.loadLibrary(...

这样做之后,我得到了更多 SIGSEGVs,这里有一些例子:

#  SIGSEGV (0xb) at pc=0x00007f203b4b7c13, pid=92730, tid=139775595345664
#
# JRE version: Java(TM) SE Runtime Environment (8.0_60-b27) (build 1.8.0_60-b27)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x440c13]  ciBytecodeStream::get_method(bool&, ciSignature**)+0x513
#

#  SIGSEGV (0xb) at pc=0x00007f29ef518f5c, pid=73559, tid=139817217382144
#
# JRE version: Java(TM) SE Runtime Environment (8.0_60-b27) (build 1.8.0_60-b27)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x6e0f5c]  jni_GetArrayLength+0x6c

#  SIGSEGV (0xb) at pc=0x00007f27b5c01a8c, pid=73454, tid=139807714744064
#
# JRE version: Java(TM) SE Runtime Environment (8.0_60-b27) (build 1.8.0_60-b27)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x413a8c]  ciEnv::get_field_by_index(ciInstanceKlass*, int)+0x22c

#  SIGSEGV (0xb) at pc=0x00007f46f913aba5, pid=133097, tid=139942002874112
#
# JRE version: Java(TM) SE Runtime Environment (8.0_60-b27) (build 1.8.0_60-b27)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x432ba5]  ciObjArrayKlass::make(ciKlass*)+0x85

请注意,我没有指定libjsig.so,因为我无法设置相应的环境变量(我无法访问系统,因为它是一个集群节点)。

我做错了什么?

linux 上的保护模式在没有 libjsig.so 的情况下不起作用。无论如何,这不是您在生产中应该依赖的东西,因为它在线程环境中不可靠。