Почему NewGlobalRef будет выполнять дамп ядра в JNI на IBM JDK?
Я считаю, что я столкнулся с ошибкой в IBM JDK при реализации JNI.
Я работаю над Apache ActiveMQ Artemis, и нам недавно пришлось сделать следующее исправление, поскольку у нас были проблемы с IBM JDK 1.8:
https://github.com/apache/activemq-artemis/commit/18e41963b61a5ef6dbcdb150e27c07c062deaa66
Проблема заключается в получении NewGlobalRef для methodID, который, по-видимому, также является объектом. Если вы приобретете NewGlobalRef(MethodID) через Sun JDK, все в порядке, но если вы сделаете это на IBM JDK, вы получите GPF.
Я мог бы исправить слой Artemis Native, удалив NewGlobalRef (как я полагаю, в конце концов он мне не понадобился), но все равно JVM не должен делать дамп ядра из-за этого.
Я собрал проект, повторяющий проблему: https://github.com/clebertsuconic/simple-JNI-bug
если вы вернете последний коммит или прокомментируете код вокруг NewGlobalRef для идентификатора метода, все пройдет.
1 ответ
MethodIds не являются объектами. Нет причин получать им GlobalRef. Удалите вызов newGlobalRef, и он будет отлично работать на обоих vms.
Я не знаю, почему Oracle не падает (может быть, проверка значения по диапазону кучи?)
Вам известна опция -Xcheck:jni? Это поможет обнаружить и предупредить о неправильном использовании jni.