Почему 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.

Другие вопросы по тегам