2015-09-30 4 views
2

Я считаю, что я ударил ошибку в IBM JDK о реализации JNI.Почему NewGlobalRef станет основным дампом JNI на IBM JDK?

Я работаю над Apache ActiveMQ Артемиды и недавно мы должны были сделать this following fix, как у нас были проблемы на IBM JDK 1.8:

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

Выпуск вокруг эквайринга NewGlobalRef на более methodID, который предположительно, также является объектом. Если вы приобретете NewGlobalRef (MethodID) через Sun JDK, все будет в порядке, но если вы сделаете это на IBM JDK, тогда вы получите GPF.

Я мог бы исправить родной слой Artemis, удалив NewGlobalRef (как мне кажется, мне не нужно было в конце), но из-за этого JVM не должен сбрасывать ядро.

я соединил проект тиражирования вопроса: https://github.com/clebertsuconic/simple-JNI-bug

если вы убираете последнее коммят или прокомментировать код вокруг NewGlobalRef на методе ID все пройдет.

ответ

2

MethodIds не являются объектами. У них нет оснований для получения GlobalRef. Удалите вызов newGlobalRef, и он будет работать нормально на обоих vms.

Я не знаю, почему Oracle не сломается (возможно проверить значение от диапазона кучи?)

Вы осведомлены о -Xcheck: JNI вариант? Это поможет обнаружить и предупредить о некорректном использовании jni.

+0

Спасибо ... Oracle JDK также потерпит неудачу, если вы пройдете -Xcheck: jni. Я не знал об этом. сделают это частью моих параметров уверенности, поэтому мой модульный тест поймает любые будущие проблемы. спасибо –