为什么 NewGlobalRef 会在 IBM JDK 上对 JNI 进行核心转储?
Why NewGlobalRef will core dump on JNI on an IBM JDK?
我相信我在 IBM JDK 的 JNI 实现上遇到了一个错误。
我正在研究 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 周围的代码,一切都会通过。
MethodId 不是对象。没有理由向他们获取 GlobalRef。删除 newGlobalRef 调用,它将在两个虚拟机上正常工作。
我不知道为什么 Oracle 没有崩溃(也许是根据堆范围检查值?)
您知道 -Xcheck:jni 选项吗?它将有助于检测和警告不正确的 jni 使用。
我相信我在 IBM JDK 的 JNI 实现上遇到了一个错误。
我正在研究 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 周围的代码,一切都会通过。
MethodId 不是对象。没有理由向他们获取 GlobalRef。删除 newGlobalRef 调用,它将在两个虚拟机上正常工作。
我不知道为什么 Oracle 没有崩溃(也许是根据堆范围检查值?)
您知道 -Xcheck:jni 选项吗?它将有助于检测和警告不正确的 jni 使用。