hotspot/src/share/vm/runtime/jniHandles.cpp
void JNIHandleBlock::weak_oops_do(BoolObjectClosure* is_alive,
OopClosure* f) {
{- -------------------------------------------
(1) (以下の二重 for ループ内で,
この JNIHandleBlock オブジェクトから _next フィールドでつながっている全ての JNIHandleBlock オブジェクトを辿り,
それらの中に含まれる全ての JNI Handle を処理していく)
---------------------------------------- -}
for (JNIHandleBlock* current = this; current != NULL; current = current->_next) {
assert(current->pop_frame_link() == NULL,
"blocks holding weak global JNI handles should not have pop frame link set");
for (int index = 0; index < current->_top; index++) {
{- -------------------------------------------
(1) もし, JNI Handle の指している先が NULL ではなく,
かつヒープ内を指しており (= deleted handle やフリーリストを指しているわけではなく)
かつ差し先が生きていれば,
引数で与えられた OopClosure を使って JNI Handle 内のポインタを修正しておく.
(なお, 差し先が生きているかどうかは, 引数で与えられた BoolObjectClosure の
BoolObjectClosure::do_object_b() で判定)
逆に, 差し先が死んでいた場合は, JNI Handle の値を NULL にしている.
(なお, 差し先が死んでいた場合は(トレース出力)も出している)
---------------------------------------- -}
oop* root = &(current->_handles)[index];
oop value = *root;
// traverse heap pointers only, not deleted handles or free list pointers
if (value != NULL && Universe::heap()->is_in_reserved(value)) {
if (is_alive->do_object_b(value)) {
// The weakly referenced object is alive, update pointer
f->do_oop(root);
} else {
// The weakly referenced object is not alive, clear the reference by storing NULL
if (TraceReferenceGC) {
tty->print_cr("Clearing JNI weak reference (" INTPTR_FORMAT ")", root);
}
*root = NULL;
}
}
}
// the next handle block is valid only if current block is full
if (current->_top < block_size_in_oops) {
break;
}
}
{- -------------------------------------------
(1) JVMTI 関係のデータ構造内にも JNI の weak global reference が含まれている可能性があるため,
JvmtiExport::weak_oops_do() を呼んで処理しておく.
---------------------------------------- -}
/*
* JVMTI data structures may also contain weak oops. The iteration of them
* is placed here so that we don't need to add it to each of the collectors.
*/
JvmtiExport::weak_oops_do(is_alive, f);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.