Top


定義場所(file name)

hotspot/src/share/vm/services/memoryService.cpp

説明(description)

// Add memory pools for GenCollectedHeap
// This function currently only supports two generations collected heap.
// The collector for GenCollectedHeap will have two memory managers.

名前(function name)

void MemoryService::add_gen_collected_heap_info(GenCollectedHeap* heap) {

本体部(body)

  {- -------------------------------------------
  (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.