ibm-jdk - 为什么 NewGlobalRef 将在 IBM JDK 上的 JNI 上进行核心转储?

标签 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 - 为什么 NewGlobalRef 将在 IBM JDK 上的 JNI 上进行核心转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32871715/

相关文章:

java - ibm jdk和oracle jdk有什么区别?

java - 下载 IBM J9 JDK

java - 使用IBM JDK而不使用TLS 1.2的Gradle构建

apple-push-notifications - Worklight 推送通知 (APNS) 失败并出现 javax.net.ssl.SSLHandshakeException

java - 如何为 Websphere 配置文件启用 JDK 7

java-8 - 最新的 websphere liberty 全平台会运行 oracle java 8 吗?

java - IntelliJ 14 可以与 IBM JDK 1.7 一起使用吗?

java - 使用 SSL 访问 Web 服务时出错

java - 我们如何使用Java获得IBM JRE的SR和FP?