Top


定義場所(file name)

hotspot/src/share/vm/memory/defNewGeneration.cpp

名前(function name)

oop DefNewGeneration::copy_to_survivor_space(oop old) {

本体部(body)

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(is_in_reserved(old) && !old->is_forwarded(),
             "shouldn't be scavenging this oop");

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      size_t s = old->size();
      oop obj = NULL;

  {- -------------------------------------------
  (1) オブジェクトの年齢が Old 領域への昇格閾値(= DefNewGeneration::tenuring_threshold())より低い場合には, 
      ContiguousSpace::allocate() で To 領域内にコピー先を確保する.
      ---------------------------------------- -}

      // Try allocating obj in to-space (unless too old)
      if (old->age() < tenuring_threshold()) {
        obj = (oop) to()->allocate(s);
      }

  {- -------------------------------------------
  (1) オブジェクトの年齢が Old 領域への昇格閾値より高い場合, 
      もしくは To 領域内にメモリを確保するのに失敗した場合には, 
      Generation::promote() で Old 領域内にコピー先を確保する.

      (なお, Generation::promote() が失敗した場合は
       DefNewGeneration::handle_promotion_failure() を呼んで後始末をした後, 
       ここでリターン)
      ---------------------------------------- -}

      // Otherwise try allocating obj tenured
      if (obj == NULL) {
        obj = _next_gen->promote(old, s);
        if (obj == NULL) {
          handle_promotion_failure(old);
          return old;
        }

  {- -------------------------------------------
  (1) 逆に, To 領域内でのメモリ確保に成功した場合には, 
      Copy::aligned_disjoint_words() でオブジェクトの中身を確保した領域にコピーする.

      (ついでに, コピー先のオブジェクトは age を1つインクリメントしている.
       また, 次の tenuring threshould の計算のために, ageTable にオブジェクトの情報を登録している)

      (なお高速化のため, Prefetch::write() で 
       PrefetchCopyIntervalInBytes バイト
       メモリをプリフェッチしてからコピーを行っている)
      ---------------------------------------- -}

      } else {
        // Prefetch beyond obj
        const intx interval = PrefetchCopyIntervalInBytes;
        Prefetch::write(obj, interval);

        // Copy obj
        Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)obj, s);

        // Increment age if obj still in new generation
        obj->incr_age();
        age_table()->add(obj, s);
      }

  {- -------------------------------------------
  (1) 処理対象のオブジェクト内に, コピー先のポインタを 
      forwarding pointer として埋めこむ.
      ---------------------------------------- -}

      // Done, insert forward pointer to obj in this header
      old->forward_to(obj);

  {- -------------------------------------------
  (1) コピー先のアドレスをリターン
      ---------------------------------------- -}

      return obj;
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.