NewGlobalRef
,DeleteGlobalRef
,DeleteLocalRef
,NewLocalRef
,NewGlobalRef() や NewLocalRef() の処理は, 指定された oop を Thread::active_handles や JNIHandles::_globalhandles 内に格納するだけ.
逆に, DeleteGlobalRef() や DeleteLocalRef() の処理は, JNIHandleBlock 内の対応する箇所に JNIHandles::_deleted_handle の値を書き込むだけ.
(See: JNIHandleBlock)
JNI 関数の中には暗黙的に JNI local 参照を生成するものもある. そういった関数の内部では JNIHandles::make_local() が呼び出されている.
JNIHandles::make_local() は, 引数違いのものが (ここで説明するものも含めて) 3種類程ある. 中身はどれも同じようなもんだが...
jni_NewGlobalRef() -> JNIHandles::make_global() -> JNIHandleBlock::allocate_handle() -> JNIHandleBlock::rebuild_free_list() (<= どうしても空きが見つからない場合に呼び出す)
jni_DeleteGlobalRef() -> JNIHandles::destroy_global()
jni_DeleteLocalRef() -> JNIHandles::destroy_local()
jni_NewLocalRef() -> JNIHandles::make_local(JNIEnv* env, oop obj) -> JNIHandleBlock::allocate_handle() -> (同上)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.