hotspot/src/share/vm/services/memoryService.cpp
void MemoryService::set_universe_heap(CollectedHeap* heap) {
{- -------------------------------------------
(1) ヒープの種類 (CollectedHeap のどのサブクラスか) に応じて
使用する MemoryManager や MemoryPool が異なる.
以下の switch 文で, 適切な MemoryManager/MemoryPool を生成する関数を呼び分けている.
* GenCollectedHeap の場合:
MemoryService::add_gen_collected_heap_info()
* ParallelScavengeHeap の場合:
MemoryService::add_parallel_scavenge_heap_info()
* G1CollectedHeap の場合:
MemoryService::add_g1_heap_info()
---------------------------------------- -}
CollectedHeap::Name kind = heap->kind();
switch (kind) {
case CollectedHeap::GenCollectedHeap : {
add_gen_collected_heap_info(GenCollectedHeap::heap());
break;
}
#ifndef SERIALGC
case CollectedHeap::ParallelScavengeHeap : {
add_parallel_scavenge_heap_info(ParallelScavengeHeap::heap());
break;
}
case CollectedHeap::G1CollectedHeap : {
add_g1_heap_info(G1CollectedHeap::heap());
break;
}
#endif // SERIALGC
default: {
guarantee(false, "Unrecognized kind of heap");
}
}
{- -------------------------------------------
(1) GcThreadCountClosure で GC スレッドの数を数え (以下の count),
GCMemoryManager::set_num_gc_threads() で
_minor_gc_manager と _major_gc_manager 内にスレッド数を登録しておく.
---------------------------------------- -}
// set the GC thread count
GcThreadCountClosure gctcc;
heap->gc_threads_do(&gctcc);
int count = gctcc.count();
if (count > 0) {
_minor_gc_manager->set_num_gc_threads(count);
_major_gc_manager->set_num_gc_threads(count);
}
{- -------------------------------------------
(1) GCMemoryManager::initialize_gc_stat_info() で,
_minor_gc_manager と _major_gc_manager 内の GCStatInfo をを初期化しておく.
---------------------------------------- -}
// All memory pools and memory managers are initialized.
//
_minor_gc_manager->initialize_gc_stat_info();
_major_gc_manager->initialize_gc_stat_info();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.