hotspot/src/share/vm/services/memoryService.cpp
// Add memory pools for GenCollectedHeap
// This function currently only supports two generations collected heap.
// The collector for GenCollectedHeap will have two memory managers.
void MemoryService::add_gen_collected_heap_info(GenCollectedHeap* heap) {
{- -------------------------------------------
(1) 以下で, Minor GC / Major GC 用の MemoryManager を取得する.
使用している GC アルゴリズムに応じて, 以下のように適切な関数が呼び出される.
* Minor GC 用の MemoryManager
* DefNew の場合
MemoryManager::get_copy_memory_manager()
* ParNew の場合
MemoryManager::get_parnew_memory_manager()
* Major GC 用の MemoryManager
* MSC の場合
MemoryManager::get_msc_memory_manager()
* CMS の場合
MemoryManager::get_cms_memory_manager()
---------------------------------------- -}
CollectorPolicy* policy = heap->collector_policy();
assert(policy->is_two_generation_policy(), "Only support two generations");
guarantee(heap->n_gens() == 2, "Only support two-generation heap");
TwoGenerationCollectorPolicy* two_gen_policy = policy->as_two_generation_policy();
if (two_gen_policy != NULL) {
GenerationSpec** specs = two_gen_policy->generations();
Generation::Name kind = specs[0]->name();
switch (kind) {
case Generation::DefNew:
_minor_gc_manager = MemoryManager::get_copy_memory_manager();
break;
#ifndef SERIALGC
case Generation::ParNew:
case Generation::ASParNew:
_minor_gc_manager = MemoryManager::get_parnew_memory_manager();
break;
#endif // SERIALGC
default:
guarantee(false, "Unrecognized generation spec");
break;
}
if (policy->is_mark_sweep_policy()) {
_major_gc_manager = MemoryManager::get_msc_memory_manager();
#ifndef SERIALGC
} else if (policy->is_concurrent_mark_sweep_policy()) {
_major_gc_manager = MemoryManager::get_cms_memory_manager();
#endif // SERIALGC
} else {
guarantee(false, "Unknown two-gen policy");
}
} else {
guarantee(false, "Non two-gen policy");
}
_managers_list->append(_minor_gc_manager);
_managers_list->append(_major_gc_manager);
{- -------------------------------------------
(1) MemoryService::add_generation_memory_pool() を呼んで,
New 領域と Old 領域用の MemoryPool オブジェクトを生成する.
---------------------------------------- -}
add_generation_memory_pool(heap->get_gen(minor), _major_gc_manager, _minor_gc_manager);
add_generation_memory_pool(heap->get_gen(major), _major_gc_manager);
{- -------------------------------------------
(1) 以下で Perm 領域用の MemoryPool オブジェクトを生成する.
使用している GC アルゴリズムに応じて, 以下のように適切な関数が呼び出される.
* MSC の場合
MemoryService::add_compact_perm_gen_memory_pool()
* CMS の場合
MemoryService::add_cms_perm_gen_memory_pool()
---------------------------------------- -}
PermGen::Name name = policy->permanent_generation()->name();
switch (name) {
case PermGen::MarkSweepCompact: {
CompactingPermGenGen* perm_gen = (CompactingPermGenGen*) heap->perm_gen();
add_compact_perm_gen_memory_pool(perm_gen, _major_gc_manager);
break;
}
#ifndef SERIALGC
case PermGen::ConcurrentMarkSweep: {
CMSPermGenGen* cms_gen = (CMSPermGenGen*) heap->perm_gen();
add_cms_perm_gen_memory_pool(cms_gen, _major_gc_manager);
break;
}
#endif // SERIALGC
default:
guarantee(false, "Unrecognized perm generation");
break;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.