< prev index next >

src/hotspot/share/services/memoryManager.cpp

Print this page
rev 47957 : 8191564: Refactor GC related servicability code into GC specific subclasses


  42   (void)const_cast<instanceOop&>(_memory_mgr_obj = instanceOop(NULL));
  43 }
  44 
  45 void MemoryManager::add_pool(MemoryPool* pool) {
  46   assert(_num_pools < MemoryManager::max_num_pools, "_num_pools exceeds the max");
  47   if (_num_pools < MemoryManager::max_num_pools) {
  48     _pools[_num_pools] = pool;
  49     _num_pools++;
  50   }
  51   pool->add_manager(this);
  52 }
  53 
  54 MemoryManager* MemoryManager::get_code_cache_memory_manager() {
  55   return (MemoryManager*) new CodeCacheMemoryManager();
  56 }
  57 
  58 MemoryManager* MemoryManager::get_metaspace_memory_manager() {
  59   return (MemoryManager*) new MetaspaceMemoryManager();
  60 }
  61 
  62 GCMemoryManager* MemoryManager::get_copy_memory_manager() {
  63   return (GCMemoryManager*) new CopyMemoryManager();
  64 }
  65 
  66 GCMemoryManager* MemoryManager::get_msc_memory_manager() {
  67   return (GCMemoryManager*) new MSCMemoryManager();
  68 }
  69 
  70 GCMemoryManager* MemoryManager::get_parnew_memory_manager() {
  71   return (GCMemoryManager*) new ParNewMemoryManager();
  72 }
  73 
  74 GCMemoryManager* MemoryManager::get_cms_memory_manager() {
  75   return (GCMemoryManager*) new CMSMemoryManager();
  76 }
  77 
  78 GCMemoryManager* MemoryManager::get_psScavenge_memory_manager() {
  79   return (GCMemoryManager*) new PSScavengeMemoryManager();
  80 }
  81 
  82 GCMemoryManager* MemoryManager::get_psMarkSweep_memory_manager() {
  83   return (GCMemoryManager*) new PSMarkSweepMemoryManager();
  84 }
  85 
  86 GCMemoryManager* MemoryManager::get_g1YoungGen_memory_manager() {
  87   return (GCMemoryManager*) new G1YoungGenMemoryManager();
  88 }
  89 
  90 GCMemoryManager* MemoryManager::get_g1OldGen_memory_manager() {
  91   return (GCMemoryManager*) new G1OldGenMemoryManager();
  92 }
  93 
  94 instanceOop MemoryManager::get_memory_manager_instance(TRAPS) {
  95   // Must do an acquire so as to force ordering of subsequent
  96   // loads from anything _memory_mgr_obj points to or implies.
  97   instanceOop mgr_obj = OrderAccess::load_acquire(&_memory_mgr_obj);
  98   if (mgr_obj == NULL) {
  99     // It's ok for more than one thread to execute the code up to the locked region.
 100     // Extra manager instances will just be gc'ed.
 101     Klass* k = Management::sun_management_ManagementFactoryHelper_klass(CHECK_0);
 102 
 103     Handle mgr_name = java_lang_String::create_from_str(name(), CHECK_0);
 104 
 105     JavaValue result(T_OBJECT);
 106     JavaCallArguments args;
 107     args.push_oop(mgr_name);    // Argument 1
 108 
 109     Symbol* method_name = NULL;
 110     Symbol* signature = NULL;
 111     if (is_gc_memory_manager()) {
 112       Klass* extKlass = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK_0);
 113       // com.sun.management.GarbageCollectorMXBean is in jdk.management module which may not be present.


 291 
 292       // Compare with GC usage threshold
 293       pool->set_last_collection_usage(usage);
 294       LowMemoryDetector::detect_after_gc_memory(pool);
 295     }
 296   }
 297 
 298   if (countCollection) {
 299     _num_collections++;
 300     // alternately update two objects making one public when complete
 301     {
 302       MutexLockerEx ml(_last_gc_lock, Mutex::_no_safepoint_check_flag);
 303       GCStatInfo *tmp = _last_gc_stat;
 304       _last_gc_stat = _current_gc_stat;
 305       _current_gc_stat = tmp;
 306       // reset the current stat for diagnosability purposes
 307       _current_gc_stat->clear();
 308     }
 309 
 310     if (is_notification_enabled()) {
 311       bool isMajorGC = this == MemoryService::get_major_gc_manager();
 312       GCNotifier::pushNotification(this, isMajorGC ? "end of major GC" : "end of minor GC",
 313                                    GCCause::to_string(cause));
 314     }
 315   }
 316 }
 317 
 318 size_t GCMemoryManager::get_last_gc_stat(GCStatInfo* dest) {
 319   MutexLockerEx ml(_last_gc_lock, Mutex::_no_safepoint_check_flag);
 320   if (_last_gc_stat->gc_index() != 0) {
 321     dest->set_index(_last_gc_stat->gc_index());
 322     dest->set_start_time(_last_gc_stat->start_time());
 323     dest->set_end_time(_last_gc_stat->end_time());
 324     assert(dest->usage_array_size() == _last_gc_stat->usage_array_size(),
 325            "Must have same array size");
 326     size_t len = dest->usage_array_size() * sizeof(MemoryUsage);
 327     memcpy(dest->before_gc_usage_array(), _last_gc_stat->before_gc_usage_array(), len);
 328     memcpy(dest->after_gc_usage_array(), _last_gc_stat->after_gc_usage_array(), len);
 329   }
 330   return _last_gc_stat->gc_index();
 331 }


  42   (void)const_cast<instanceOop&>(_memory_mgr_obj = instanceOop(NULL));
  43 }
  44 
  45 void MemoryManager::add_pool(MemoryPool* pool) {
  46   assert(_num_pools < MemoryManager::max_num_pools, "_num_pools exceeds the max");
  47   if (_num_pools < MemoryManager::max_num_pools) {
  48     _pools[_num_pools] = pool;
  49     _num_pools++;
  50   }
  51   pool->add_manager(this);
  52 }
  53 
  54 MemoryManager* MemoryManager::get_code_cache_memory_manager() {
  55   return (MemoryManager*) new CodeCacheMemoryManager();
  56 }
  57 
  58 MemoryManager* MemoryManager::get_metaspace_memory_manager() {
  59   return (MemoryManager*) new MetaspaceMemoryManager();
  60 }
  61 
































  62 instanceOop MemoryManager::get_memory_manager_instance(TRAPS) {
  63   // Must do an acquire so as to force ordering of subsequent
  64   // loads from anything _memory_mgr_obj points to or implies.
  65   instanceOop mgr_obj = OrderAccess::load_acquire(&_memory_mgr_obj);
  66   if (mgr_obj == NULL) {
  67     // It's ok for more than one thread to execute the code up to the locked region.
  68     // Extra manager instances will just be gc'ed.
  69     Klass* k = Management::sun_management_ManagementFactoryHelper_klass(CHECK_0);
  70 
  71     Handle mgr_name = java_lang_String::create_from_str(name(), CHECK_0);
  72 
  73     JavaValue result(T_OBJECT);
  74     JavaCallArguments args;
  75     args.push_oop(mgr_name);    // Argument 1
  76 
  77     Symbol* method_name = NULL;
  78     Symbol* signature = NULL;
  79     if (is_gc_memory_manager()) {
  80       Klass* extKlass = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK_0);
  81       // com.sun.management.GarbageCollectorMXBean is in jdk.management module which may not be present.


 259 
 260       // Compare with GC usage threshold
 261       pool->set_last_collection_usage(usage);
 262       LowMemoryDetector::detect_after_gc_memory(pool);
 263     }
 264   }
 265 
 266   if (countCollection) {
 267     _num_collections++;
 268     // alternately update two objects making one public when complete
 269     {
 270       MutexLockerEx ml(_last_gc_lock, Mutex::_no_safepoint_check_flag);
 271       GCStatInfo *tmp = _last_gc_stat;
 272       _last_gc_stat = _current_gc_stat;
 273       _current_gc_stat = tmp;
 274       // reset the current stat for diagnosability purposes
 275       _current_gc_stat->clear();
 276     }
 277 
 278     if (is_notification_enabled()) {
 279       GCNotifier::pushNotification(this, gc_end_message(),

 280                                    GCCause::to_string(cause));
 281     }
 282   }
 283 }
 284 
 285 size_t GCMemoryManager::get_last_gc_stat(GCStatInfo* dest) {
 286   MutexLockerEx ml(_last_gc_lock, Mutex::_no_safepoint_check_flag);
 287   if (_last_gc_stat->gc_index() != 0) {
 288     dest->set_index(_last_gc_stat->gc_index());
 289     dest->set_start_time(_last_gc_stat->start_time());
 290     dest->set_end_time(_last_gc_stat->end_time());
 291     assert(dest->usage_array_size() == _last_gc_stat->usage_array_size(),
 292            "Must have same array size");
 293     size_t len = dest->usage_array_size() * sizeof(MemoryUsage);
 294     memcpy(dest->before_gc_usage_array(), _last_gc_stat->before_gc_usage_array(), len);
 295     memcpy(dest->after_gc_usage_array(), _last_gc_stat->after_gc_usage_array(), len);
 296   }
 297   return _last_gc_stat->gc_index();
 298 }
< prev index next >