java - "consider using jsig library"是什么意思?

标签 java java-native-interface

我正在运行一个 Java 程序,该程序使用带有 -Xcheck:jni 标志的 JNI,并且收到如下所示的消息:

SIGSEGV:[libjvm.so+0x6fd190],sa_mask[0]=0x00000400,sa_flags=0x10000000,标志从0x10000004更改,考虑使用jsig库

这是什么意思?我应该担心吗?什么是 jsig 库?

我在 Linux 上使用 Java 7,或者准确地说:

JRE version: 7.0_03-b04
Java VM: Java HotSpot(TM) 64-Bit Server VM (22.1-b02 mixed mode linux-amd64 compressed oops)

最佳答案

更多细节,因为有关信号链的文档有点稀疏:

Java VM(至少是 Oracle 实现,还包括 OpenJDK)使用 POSIX 信号进行内部通信,因此它安装了信号处理程序,例如对于 SIGSEGV。这意味着,为了正确工作,Java VM 必须获取并检查进程中发生的任何 SIGSEGV,以区分“通信”SIGSEGV 和可能是程序错误的真实 SIGSEGV。

但是信号处理程序是一种全局资源,在进程中任何 native 代码都可以安装信号处理程序并替换 Java VM 安装的信号处理程序。

-Xcheck:jni 使 VM 运行定期检查,其中包括是否有人更改了 Java VM 下的信号处理程序。如果检测到更改,则会打印警告。

为了解决这个问题(用户安装的信号处理程序取代 JavaVM 信号处理程序)并适应可能有理由安装信号处理程序的用户代码,Java VM 使用“信号链接”,这基本上意味着信号处理程序( VM 和用户)相互链接:JavaVM 信号处理程序首先运行;如果他们认为 VM 对该信号不感兴趣,则会将信号传递给用户处理程序。

有两种方法可以激活此支持: 1) 使用您自己的 native 启动器(加载 libjvm.so 的 C 程序,调用 JNI_CreateJavaVM 来创建 VM 等)。在这种情况下,如果启动器在创建 Java VM 之前安装其用户信号处理程序,则 Java VM 将记住用户处理程序并将它们链接到自己的信号处理程序后面。 2)如果在创建Java VM之后加载用户 native 代码,则这不起作用。 libjsig.so 是这个问题的答案:它用自己的版本替换了系统信号 API(sigaction() 等),并且任何尝试安装信号处理程序的用户代码都不会替换全局信号处理程序,但用户处理程序将链接在(已安装的)Java VM 信号处理程序后面。

为了使(2)起作用,必须在启动 VM 之前使用 LD_PRELOAD 加载 libjsig.so:

示例: LD_PRELOAD=//jre/lib/amd64/libjsig.so java myprogram

关于java - "consider using jsig library"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15790403/

相关文章:

java - 我怎样才能停止声音

java - 我的应用程序显示错误的名称

java - Android经纬度返回null

JNI 的 Java 运行时错误

java - Java Comparator.comparing() 类型签名是什么意思?

java - 在 Java 中,这是否被视为 "nested IF statement"的示例?

Android Wrap Shell 脚本无法按预期工作

java - 为什么JVM在进入无限递归时不会崩溃?

c - MakeFile:错误:<jni.h>:没有这样的文件或目录

java - 在 C++ 中使用 JNI 创建 JVM 不返回