hotspot/src/share/vm/memory/defNewGeneration.cpp
oop DefNewGeneration::copy_to_survivor_space(oop old) {
{- -------------------------------------------
(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.