2015-09-30 56 views
2

我相信我在JNI實現上遇到了IBM JDK上的一個bug。爲什麼NewGlobalRef將核心轉儲到IBM JDK上的JNI上?

我工作的Apache ActiveMQ的阿蒂米斯與我們最近不得不作出this following fix時,我們在對IBM JDK 1.8的問題:一個放在methodID,

https://github.com/apache/activemq-artemis/commit/18e41963b61a5ef6dbcdb150e27c07c062deaa66

的問題是圍繞收購NewGlobalRef這大概也是一個對象。如果通過Sun JDK獲得NewGlobalRef(MethodID),一切都很好,但是如果您在IBM JDK上執行此操作,那麼您將獲得GPF。

我可以通過刪除NewGlobalRef來修復Artemis Native層(因爲我相信我最終不需要),但仍然因爲這個原因,JVM不應該核心轉儲。

我已經把一個項目複製問題: https://github.com/clebertsuconic/simple-JNI-bug

如果還原最後一次提交,或評論圍繞NewGlobalRef代碼的方法ID一切都會過去。

回答

2

MethodIds不是對象。沒有理由向他們獲取GlobalRef。除去newGlobalRef調用,它在兩個vms上都能正常工作。

我不知道爲什麼Oracle不崩潰(也許檢查對堆範圍值?)

你知道的-Xcheck的:JNI選項?它將幫助檢測並警告不正確的jni使用情況。

+0

謝謝......如果您通過-Xcheck:jni,Oracle JDK也會失敗。我不知道這個選項。將使它成爲我的絕對參數的一部分,所以我的單元測試將捕獲任何未來的問題。 謝謝 –