NewWeakGlobalRef
,DeleteWeakGlobalRef
,NewWeakGlobalRef() の処理は, 指定された oop を JNIHandles::_weak_global_handles に格納するだけ.
逆に, DeleteWeakGlobalRef() の処理は, JNIHandleBlock 内の対応する箇所に JNIHandles::_deleted_handle の値を書き込むだけ.
(このため, 処理としては NewGlobalRef() や DeleteGlobalRef(), NewLocalRef() や DeleteLocalRef() とほぼ同じ (See: here for details))
WeakGlobalRef が GC 時に NULL になる処理は ReferenceProcessor::process_phaseJNI() 内で行われている (See: here for details).
jni_NewWeakGlobalRef() -> JNIHandles::make_weak_global() -> JNIHandleBlock::allocate_handle() -> JNIHandleBlock::rebuild_free_list() (<= どうしても空きが見つからない場合に呼び出す)
jni_DeleteWeakGlobalRef() -> JNIHandles::destroy_weak_global()
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.