Top


定義場所(file name)

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

名前(function name)

void
ParallelCompactData::summarize_dense_prefix(HeapWord* beg, HeapWord* end)
{

本体部(body)

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

      assert(region_offset(beg) == 0, "not RegionSize aligned");
      assert(region_offset(end) == 0, "not RegionSize aligned");

  {- -------------------------------------------
  (1) 引数の beg と end で指定された範囲に含まれる全ての region について, 以下の関数を呼び出して
      対応する ParallelCompactData::RegionData オブジェクトに情報を設定する.
      (といっても, この関数は dense prefix に含まれる region 用なので
       全てコンパクション先は自分自身.
       このため設定内容は非常に簡単.)

      * ParallelCompactData::RegionData::set_destination()
        コンパクション先のアドレスは, 現在の自分自身のアドレスとする.
      * ParallelCompactData::RegionData::set_destination_count()
        コンパクション先は自分自身だけなので 0.
      * ParallelCompactData::RegionData::set_source_region()
        コンパクション元は自分自身とする.
      * ParallelCompactData::RegionData::set_data_location()
        対応するアドレスも, 現在の自分自身のアドレスとする.
      * ParallelCompactData::RegionData::set_live_obj_size()
        (dead オブジェクトは1つもないので) RegionSize から 
        region の先頭に掛かっている partial object 量を引いたものとする.
      ---------------------------------------- -}

      size_t cur_region = addr_to_region_idx(beg);
      const size_t end_region = addr_to_region_idx(end);
      HeapWord* addr = beg;
      while (cur_region < end_region) {
        _region_data[cur_region].set_destination(addr);
        _region_data[cur_region].set_destination_count(0);
        _region_data[cur_region].set_source_region(cur_region);
        _region_data[cur_region].set_data_location(addr);

        // Update live_obj_size so the region appears completely full.
        size_t live_size = RegionSize - _region_data[cur_region].partial_obj_size();
        _region_data[cur_region].set_live_obj_size(live_size);

        ++cur_region;
        addr += RegionSize;
      }
    }

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