--- a/src/hotspot/share/services/memoryManager.cpp Tue Jun 19 07:54:11 2018 -0400
+++ b/src/hotspot/share/services/memoryManager.cpp Tue Jun 19 05:18:49 2018 -0700
@@ -43,13 +43,15 @@
(void)const_cast<instanceOop&>(_memory_mgr_obj = instanceOop(NULL));
}
-void MemoryManager::add_pool(MemoryPool* pool) {
- assert(_num_pools < MemoryManager::max_num_pools, "_num_pools exceeds the max");
- if (_num_pools < MemoryManager::max_num_pools) {
- _pools[_num_pools] = pool;
+int MemoryManager::add_pool(MemoryPool* pool) {
+ int index = _num_pools;
+ assert(index < MemoryManager::max_num_pools, "_num_pools exceeds the max");
+ if (index < MemoryManager::max_num_pools) {
+ _pools[index] = pool;
_num_pools++;
}
pool->add_manager(this);
+ return index;
}
MemoryManager* MemoryManager::get_code_cache_memory_manager() {
@@ -189,6 +191,15 @@
delete _current_gc_stat;
}
+void GCMemoryManager::add_pool(MemoryPool* pool) {
+ add_pool(pool, true);
+}
+
+void GCMemoryManager::add_pool(MemoryPool* pool, bool always_affected_by_gc) {
+ int index = MemoryManager::add_pool(pool);
+ _pool_always_affected_by_gc[index] = always_affected_by_gc;
+}
+
void GCMemoryManager::initialize_gc_stat_info() {
assert(MemoryService::num_memory_pools() > 0, "should have one or more memory pools");
_last_gc_stat = new(ResourceObj::C_HEAP, mtGC) GCStatInfo(MemoryService::num_memory_pools());
@@ -230,7 +241,8 @@
void GCMemoryManager::gc_end(bool recordPostGCUsage,
bool recordAccumulatedGCTime,
bool recordGCEndTime, bool countCollection,
- GCCause::Cause cause) {
+ GCCause::Cause cause,
+ bool allMemoryPoolsAffected) {
if (recordAccumulatedGCTime) {
_accumulated_timer.stop();
}
@@ -259,9 +271,11 @@
MemoryPool* pool = get_memory_pool(i);
MemoryUsage usage = pool->get_memory_usage();
- // Compare with GC usage threshold
- pool->set_last_collection_usage(usage);
- LowMemoryDetector::detect_after_gc_memory(pool);
+ if (allMemoryPoolsAffected || pool_always_affected_by_gc(i)) {
+ // Compare with GC usage threshold
+ pool->set_last_collection_usage(usage);
+ LowMemoryDetector::detect_after_gc_memory(pool);
+ }
}
}