hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
void SplitInfo::record(size_t src_region_idx, size_t partial_obj_size,
HeapWord* destination)
{
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(src_region_idx != 0, "invalid src_region_idx");
assert(partial_obj_size != 0, "invalid partial_obj_size argument");
assert(destination != NULL, "invalid destination argument");
{- -------------------------------------------
(1) 引数で与えられた情報を, フィールド内に記録しておく.
---------------------------------------- -}
_src_region_idx = src_region_idx;
_partial_obj_size = partial_obj_size;
_destination = destination;
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
// These fields may not be updated below, so make sure they're clear.
assert(_dest_region_addr == NULL, "should have been cleared");
assert(_first_src_addr == NULL, "should have been cleared");
{- -------------------------------------------
(1) (変数宣言など)
(beg_region_addr は, (region 境界にアラインメントされたアドレスの中で)
コンパクション先での partial object の先頭のアドレスを超えない最大のもの.
end_region_addr は, (region 境界にアラインメントされたアドレスの中で)
コンパクション先での partial object の終端のアドレスを超えない最大のもの.)
---------------------------------------- -}
// Determine the number of destination regions for the partial object.
HeapWord* const last_word = destination + partial_obj_size - 1;
const ParallelCompactData& sd = PSParallelCompact::summary_data();
HeapWord* const beg_region_addr = sd.region_align_down(destination);
HeapWord* const end_region_addr = sd.region_align_down(last_word);
{- -------------------------------------------
(1) 以下のフィールドの値を設定する.
* _destination_count
* _dest_region_addr
* _first_src_addr
設定する値は以下の通り. ただし, 条件については以下のように省略する.
A -- 「コンパクション先で partial object が 1つの region 内に収まる (つまり beg_region_addr == end_region_addr)」
B -- 「コンパクション先での partial object の先頭アドレスが region 境界にある (つまり end_region_addr == destination)」
* _destination_count
もし, A が成り立つなら 1,
そうでなければ 2.
* _dest_region_addr
もし, A かつ B なら, end_region_addr,
not A の場合も, end_region_addr,
それ以外なら, 値の変更は行わない.
* _first_src_addr
もし, A かつ B なら, 引数の src_region_idx に対応する region,
not A の場合は, 引数の src_region_idx に対応する region に
(end_region_addr - destination) 分のオフセットを加えたアドレス,
それ以外なら, 値の変更は行わない.
---------------------------------------- -}
if (beg_region_addr == end_region_addr) {
// One destination region.
_destination_count = 1;
if (end_region_addr == destination) {
// The destination falls on a region boundary, thus the first word of the
// partial object will be the first word copied to the destination region.
_dest_region_addr = end_region_addr;
_first_src_addr = sd.region_to_addr(src_region_idx);
}
} else {
// Two destination regions. When copied, the partial object will cross a
// destination region boundary, so a word somewhere within the partial
// object will be the first word copied to the second destination region.
_destination_count = 2;
_dest_region_addr = end_region_addr;
const size_t ofs = pointer_delta(end_region_addr, destination);
assert(ofs < _partial_obj_size, "sanity");
_first_src_addr = sd.region_to_addr(src_region_idx) + ofs;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.