我相信我在其JNI实现上遇到了IBM JDK的错误。
我正在使用Apache ActiveMQ Artemis,我们最近不得不制作this following fix因为我们在IBM JDK 1.8上遇到了问题:
https://github.com/apache/activemq-artemis/commit/18e41963b61a5ef6dbcdb150e27c07c062deaa66
问题在于在一个methodID上获取NewGlobalRef,它可能也是一个对象。如果您通过Sun JDK获得NewGlobalRef(MethodID),一切都很好,但如果您在IBM JDK上执行,那么您将获得GPF。
我可以通过删除NewGlobalRef来修复Artemis Native层(因为我认为最终我不需要),但是JVM仍然不应该因为这个原因而被转储。
我已经整理了一个复制问题的项目: https://github.com/clebertsuconic/simple-JNI-bug
如果你还原最后一次提交,或者在方法ID上围绕NewGlobalRef注释代码,一切都会通过。
答案 0 :(得分:2)
MethodIds不是对象。没有理由让他们获得GlobalRef。删除newGlobalRef调用,它将在两个vms上正常工作。
我不知道Oracle为什么不崩溃(可能会根据堆范围检查值?)
你知道-Xcheck:jni选项吗?它将有助于检测并警告错误的jni使用情况。