Top


定義場所(file name)

hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp

名前(function name)

void ParallelCompactData::add_obj(HeapWord* addr, size_t len)
{

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      (対象のオブジェクトの先頭と最後に対応するリージョンを調べる)
      ---------------------------------------- -}

      const size_t obj_ofs = pointer_delta(addr, _region_start);
      const size_t beg_region = obj_ofs >> Log2RegionSize;
      const size_t end_region = (obj_ofs + len - 1) >> Log2RegionSize;

  {- -------------------------------------------
  (1) (デバッグ用の処理)
      ---------------------------------------- -}

      DEBUG_ONLY(Atomic::inc_ptr(&add_obj_count);)
      DEBUG_ONLY(Atomic::add_ptr(len, &add_obj_size);)

  {- -------------------------------------------
  (1) 対象のオブジェクトが1つのリージョン内に収まる場合は, 
      ParallelCompactData::RegionData::add_live_obj() を呼び出して
      対応するリージョンの live object 量情報を増加させるだけ.
      (なお, 対象のオブジェクトが全部そのリージョン内に収まっているので, 
       増加させる量は対象のオブジェクトの大きさに等しい)

      この場合は, ここでリターン.
      ---------------------------------------- -}

      if (beg_region == end_region) {
        // All in one region.
        _region_data[beg_region].add_live_obj(len);
        return;
      }

  {- -------------------------------------------
  (1) 対象のオブジェクトが1つのリージョン内に収まらない場合は, 
      対象のオブジェクトを含んでいる全てのリージョンに対して以下の関数を呼び出し, 
      対応するリージョンの live object 量情報を増加させる.

      * 最初のリージョン
        ParallelCompactData::RegionData::add_live_obj()
      * 2つ目以降のリージョン
        ParallelCompactData::RegionData::set_partial_obj_size() 及び
        ParallelCompactData::RegionData::set_partial_obj_addr()

      (この場合の増加量は, それぞれのリージョンに対して
       対象のオブジェクトのうちの何バイトを格納しているかを調べ, 
       その分だけ増やしていく)
      ---------------------------------------- -}

      // First region.
      const size_t beg_ofs = region_offset(addr);
      _region_data[beg_region].add_live_obj(RegionSize - beg_ofs);

      klassOop klass = ((oop)addr)->klass();
      // Middle regions--completely spanned by this object.
      for (size_t region = beg_region + 1; region < end_region; ++region) {
        _region_data[region].set_partial_obj_size(RegionSize);
        _region_data[region].set_partial_obj_addr(addr);
      }

      // Last region.
      const size_t end_ofs = region_offset(addr + len - 1);
      _region_data[end_region].set_partial_obj_size(end_ofs + 1);
      _region_data[end_region].set_partial_obj_addr(addr);
    }

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