hotspot/src/share/vm/memory/generation.cpp
// Ignores "ref" and calls allocate().
oop Generation::promote(oop obj, size_t obj_size) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(obj_size == (size_t)obj->size(), "bad obj_size passed in");
{- -------------------------------------------
(1) (デバッグ用の処理) (#ifndef PRODUCT 時にのみ実行)
---------------------------------------- -}
#ifndef PRODUCT
if (Universe::heap()->promotion_should_fail()) {
return NULL;
}
#endif // #ifndef PRODUCT
{- -------------------------------------------
(1) Generation::allocate() を呼んで, メモリを確保する.
(このメソッドはサブクラスでオーバーライドされているため, 実際に呼ばれるメソッドはクラス毎に異なる)
---------------------------------------- -}
HeapWord* result = allocate(obj_size, false);
{- -------------------------------------------
(1) メモリ確保に成功していれば, オブジェクトをコピーした後, コピー先をリターンする.
逆に確保が失敗していたら, GenCollectedHeap::handle_failed_promotion() を呼び出して, 結果をリターン.
---------------------------------------- -}
if (result != NULL) {
Copy::aligned_disjoint_words((HeapWord*)obj, result, obj_size);
return oop(result);
} else {
GenCollectedHeap* gch = GenCollectedHeap::heap();
return gch->handle_failed_promotion(this, obj, obj_size);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.