2

私は、IBM JDK の JNI 実装でバグに遭遇したと思います。

私は Apache ActiveMQ Artemis に取り組んでおり、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 の周りのコードにコメントを付けると、すべてがパスします。

4

1 に答える 1

2

MethodId はオブジェクトではありません。それらに GlobalRef を取得する理由はありません。newGlobalRef 呼び出しを削除すると、両方の VM で正常に機能します。

Oracle がクラッシュしない理由がわかりません (ヒープ範囲に対して値をチェックしているのかもしれません)。

-Xcheck:jni オプションを知っていますか? これは、誤った jni の使用を検出して警告するのに役立ちます。

于 2015-10-02T10:21:59.953 に答える