Top


定義場所(file name)

hotspot/src/share/vm/runtime/jniHandles.cpp

名前(function name)

void JNIHandleBlock::weak_oops_do(BoolObjectClosure* is_alive,
                                  OopClosure* f) {

本体部(body)

  {- -------------------------------------------
  (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.