hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
void G1CollectedHeap::free_region_if_empty(HeapRegion* hr,
size_t* pre_used,
FreeRegionList* free_list,
HumongousRegionSet* humongous_proxy_set,
HRRSCleanupTask* hrrs_cleanup_task,
bool par) {
{- -------------------------------------------
(1) 処理対象の HeapRegion に応じて, 以下のどちらかを行う.
* 直近の GC 以前は空でなかったが, 現在は空になっており, しかも young な HeapRegion ではない場合:
G1CollectedHeap::free_humongous_region() または G1CollectedHeap::free_region() を呼んで
フリーリストにつないでおく.
* それ以外の場合:
その HeapRegion に対応する HeapRegionRemSet に対して
HeapRegionRemSet::do_cleanup_work() を呼び出し,
expand された SparsePRT オブジェクトの情報を
hrrs_cleanup_task 引数で渡された HRRSCleanupTask オブジェクト内に蓄えておく.
---------------------------------------- -}
if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) {
if (hr->isHumongous()) {
assert(hr->startsHumongous(), "we should only see starts humongous");
free_humongous_region(hr, pre_used, free_list, humongous_proxy_set, par);
} else {
free_region(hr, pre_used, free_list, par);
}
} else {
hr->rem_set()->do_cleanup_work(hrrs_cleanup_task);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.