--- old/src/hotspot/share/services/management.cpp 2018-08-07 15:31:27.184934757 +0200 +++ new/src/hotspot/share/services/management.cpp 2018-08-07 15:31:26.801922753 +0200 @@ -713,50 +713,53 @@ JVM_ENTRY(jobject, jmm_GetMemoryUsage(JNIEnv* env, jboolean heap)) ResourceMark rm(THREAD); - // Calculate the memory usage - size_t total_init = 0; - size_t total_used = 0; - size_t total_committed = 0; - size_t total_max = 0; - bool has_undefined_init_size = false; - bool has_undefined_max_size = false; - - for (int i = 0; i < MemoryService::num_memory_pools(); i++) { - MemoryPool* pool = MemoryService::get_memory_pool(i); - if ((heap && pool->is_heap()) || (!heap && pool->is_non_heap())) { - MemoryUsage u = pool->get_memory_usage(); - total_used += u.used(); - total_committed += u.committed(); + MemoryUsage usage; - if (u.init_size() == (size_t)-1) { - has_undefined_init_size = true; - } - if (!has_undefined_init_size) { - total_init += u.init_size(); + if (heap) { + usage = Universe::heap()->memory_usage(); + } else { + // Calculate the memory usage by summing up the pools. + size_t total_init = 0; + size_t total_used = 0; + size_t total_committed = 0; + size_t total_max = 0; + bool has_undefined_init_size = false; + bool has_undefined_max_size = false; + + for (int i = 0; i < MemoryService::num_memory_pools(); i++) { + MemoryPool* pool = MemoryService::get_memory_pool(i); + if (pool->is_non_heap()) { + MemoryUsage u = pool->get_memory_usage(); + total_used += u.used(); + total_committed += u.committed(); + + if (u.init_size() == MemoryUsage::undefined_size()) { + has_undefined_init_size = true; + } + if (!has_undefined_init_size) { + total_init += u.init_size(); + } + + if (u.max_size() == MemoryUsage::undefined_size()) { + has_undefined_max_size = true; + } + if (!has_undefined_max_size) { + total_max += u.max_size(); + } } + } - if (u.max_size() == (size_t)-1) { - has_undefined_max_size = true; - } - if (!has_undefined_max_size) { - total_max += u.max_size(); - } + // if any one of the memory pool has undefined init_size or max_size, + // set it to MemoryUsage::undefined_size() + if (has_undefined_init_size) { + total_init = MemoryUsage::undefined_size(); + } + if (has_undefined_max_size) { + total_max = MemoryUsage::undefined_size(); } - } - // if any one of the memory pool has undefined init_size or max_size, - // set it to -1 - if (has_undefined_init_size) { - total_init = (size_t)-1; + usage = MemoryUsage(total_init, total_used, total_committed, total_max); } - if (has_undefined_max_size) { - total_max = (size_t)-1; - } - - MemoryUsage usage((heap ? InitialHeapSize : total_init), - total_used, - total_committed, - (heap ? Universe::heap()->max_capacity() : total_max)); Handle obj = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL); return JNIHandles::make_local(env, obj());