# HG changeset patch # User stuefe # Date 1596111575 -7200 # Thu Jul 30 14:19:35 2020 +0200 # Node ID bc85c1c2d80f17c0df2ac3272ae04a0961905f2d # Parent c35fba4bce35d6d976266ec72d6c42ead2268cb8 imported patch synchronized-metaspace-perf-counters diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/gc/epsilon/epsilonMonitoringSupport.cpp --- a/src/hotspot/share/gc/epsilon/epsilonMonitoringSupport.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/gc/epsilon/epsilonMonitoringSupport.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -111,7 +111,6 @@ _heap_counters->update_all(); _space_counters->update_all(capacity, used); MetaspaceCounters::update_performance_counters(); - CompressedClassSpaceCounters::update_performance_counters(); } } diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/gc/g1/g1MonitoringSupport.cpp --- a/src/hotspot/share/gc/g1/g1MonitoringSupport.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/gc/g1/g1MonitoringSupport.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -303,7 +303,6 @@ _old_gen_counters->update_all(); MetaspaceCounters::update_performance_counters(); - CompressedClassSpaceCounters::update_performance_counters(); } } diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -189,7 +189,6 @@ young_gen()->update_counters(); old_gen()->update_counters(); MetaspaceCounters::update_performance_counters(); - CompressedClassSpaceCounters::update_performance_counters(); } size_t ParallelScavengeHeap::capacity() const { diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/gc/shared/genCollectedHeap.cpp --- a/src/hotspot/share/gc/shared/genCollectedHeap.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/gc/shared/genCollectedHeap.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -1315,7 +1315,6 @@ } MetaspaceCounters::update_performance_counters(); - CompressedClassSpaceCounters::update_performance_counters(); }; #ifndef PRODUCT diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/gc/shenandoah/shenandoahMonitoringSupport.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -101,6 +101,5 @@ _heap_region_counters->update(); MetaspaceCounters::update_performance_counters(); - CompressedClassSpaceCounters::update_performance_counters(); } } diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/gc/z/zServiceability.cpp --- a/src/hotspot/share/gc/z/zServiceability.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/gc/z/zServiceability.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -89,7 +89,6 @@ _space_counters.update_used(used); MetaspaceCounters::update_performance_counters(); - CompressedClassSpaceCounters::update_performance_counters(); } } diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/memory/metaspace.cpp --- a/src/hotspot/share/memory/metaspace.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/memory/metaspace.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -470,6 +470,22 @@ return cm->chunk_free_list_summary(); } +// Returns, in one go, reserved/committed/used for both non-class space and class space. +// The values are retrieved under lock protection and will be consistent wrt each other. +// If UseCompressedClassPointers is off, is ignored and will +// contain sizes for the whole metaspace. +static void MetaspaceUtils::get_all_sizes_synchronized(sizes_t* nonclass_sizes, sizes_t* class_sizes) { + MutexLocker cl(MetaspaceExpand_lock, Mutex::_no_safepoint_check_flag); + nonclass_sizes->reserved = reserved_bytes(Metaspace::NonClassType); + nonclass_sizes->committed = committed_bytes(Metaspace::NonClassType); + nonclass_sizes->used = used_bytes(Metaspace::NonClassType); + if (Metaspace::using_class_space()) { + class_sizes->reserved = reserved_bytes(Metaspace::ClassType); + class_sizes->committed = committed_bytes(Metaspace::ClassType); + class_sizes->used = used_bytes(Metaspace::ClassType); + } +} + void MetaspaceUtils::print_metaspace_change(const metaspace::MetaspaceSizesSnapshot& pre_meta_values) { const metaspace::MetaspaceSizesSnapshot meta_values; diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/memory/metaspace.hpp --- a/src/hotspot/share/memory/metaspace.hpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/memory/metaspace.hpp Thu Jul 30 14:19:35 2020 +0200 @@ -393,6 +393,17 @@ static size_t min_chunk_size_words(); + // Returns, in one go, reserved/committed/used for both non-class space and class space. + // The values are retrieved under lock protection and will be consistent wrt each other. + // If UseCompressedClassPointers is off, is ignored (can be NULL) and + // will contain sizes for the whole metaspace. + struct sizes_t { + size_t reserved; + size_t committed; + size_t used; + }; + static void get_all_sizes_synchronized(sizes_t* nonclass_sizes, sizes_t* class_sizes); + // Flags for print_report(). enum ReportFlag { // Show usage by class loader. diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/memory/metaspaceCounters.cpp --- a/src/hotspot/share/memory/metaspaceCounters.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/memory/metaspaceCounters.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -35,99 +35,67 @@ PerfVariable* _used; PerfVariable* _max_capacity; - PerfVariable* create_variable(const char *ns, const char *name, size_t value, TRAPS) { + static PerfVariable* create_variable(const char *ns, const char *name, size_t value, TRAPS) { const char *path = PerfDataManager::counter_name(ns, name); return PerfDataManager::create_variable(SUN_GC, path, PerfData::U_Bytes, value, THREAD); } - void create_constant(const char *ns, const char *name, size_t value, TRAPS) { + static void create_constant(const char *ns, const char *name, size_t value, TRAPS) { const char *path = PerfDataManager::counter_name(ns, name); PerfDataManager::create_constant(SUN_GC, path, PerfData::U_Bytes, value, THREAD); } public: - MetaspacePerfCounters(const char* ns, size_t min_capacity, size_t curr_capacity, size_t max_capacity, size_t used) { + MetaspacePerfCounters(const char* ns) { EXCEPTION_MARK; ResourceMark rm; - create_constant(ns, "minCapacity", min_capacity, THREAD); - _capacity = create_variable(ns, "capacity", curr_capacity, THREAD); - _max_capacity = create_variable(ns, "maxCapacity", max_capacity, THREAD); - _used = create_variable(ns, "used", used, THREAD); + create_constant(ns, "minCapacity", 0, THREAD); + _capacity = create_variable(ns, "capacity", 0, THREAD); + _max_capacity = create_variable(ns, "maxCapacity", 0, THREAD); + _used = create_variable(ns, "used", 0, THREAD); } - void update(size_t capacity, size_t max_capacity, size_t used) { - _capacity->set_value(capacity); - _max_capacity->set_value(max_capacity); + void update(size_t reserved, size_t committed, size_t used) { + // Note: Naming differs between Metaspace terminology and counters. + // E.g. counter.capacity => committed, counter.max_capacity => reserved, + // but also: Metaspace.capacity => (has no counter) + // TODO: these counters make only partly sense for Metaspace. Rename/reshape? + _max_capacity->set_value(reserved); + _capacity->set_value(committed); _used->set_value(used); } }; -MetaspacePerfCounters* MetaspaceCounters::_perf_counters = NULL; - -size_t MetaspaceCounters::used() { - return MetaspaceUtils::used_bytes(); -} - -size_t MetaspaceCounters::capacity() { - return MetaspaceUtils::committed_bytes(); -} - -size_t MetaspaceCounters::max_capacity() { - return MetaspaceUtils::reserved_bytes(); -} +static MetaspacePerfCounters* g_counters_total = NULL; +static MetaspacePerfCounters* g_counters_class_space = NULL; void MetaspaceCounters::initialize_performance_counters() { if (UsePerfData) { - assert(_perf_counters == NULL, "Should only be initialized once"); - - size_t min_capacity = 0; - _perf_counters = new MetaspacePerfCounters("metaspace", min_capacity, - capacity(), max_capacity(), used()); + assert(g_counters_total == NULL && g_counters_class_space, "Should only be initialized once"); + g_counters_total = new MetaspacePerfCounters("metaspace"); + g_counters_class_space = new MetaspacePerfCounters("compressedclassspace"); + update_performance_counters(); } } void MetaspaceCounters::update_performance_counters() { if (UsePerfData) { - assert(_perf_counters != NULL, "Should be initialized"); - - _perf_counters->update(capacity(), max_capacity(), used()); - } -} - -MetaspacePerfCounters* CompressedClassSpaceCounters::_perf_counters = NULL; - -size_t CompressedClassSpaceCounters::used() { - return MetaspaceUtils::used_bytes(Metaspace::ClassType); -} - -size_t CompressedClassSpaceCounters::capacity() { - return MetaspaceUtils::committed_bytes(Metaspace::ClassType); -} - -size_t CompressedClassSpaceCounters::max_capacity() { - return MetaspaceUtils::reserved_bytes(Metaspace::ClassType); -} - -void CompressedClassSpaceCounters::update_performance_counters() { - if (UsePerfData && UseCompressedClassPointers) { - assert(_perf_counters != NULL, "Should be initialized"); - - _perf_counters->update(capacity(), max_capacity(), used()); - } -} - -void CompressedClassSpaceCounters::initialize_performance_counters() { - if (UsePerfData) { - assert(_perf_counters == NULL, "Should only be initialized once"); - const char* ns = "compressedclassspace"; - + assert(g_counters_total != NULL && g_counters_class_space != NULL, "Should only be initialized once"); if (UseCompressedClassPointers) { - size_t min_capacity = 0; - _perf_counters = new MetaspacePerfCounters(ns, min_capacity, capacity(), - max_capacity(), used()); + MetaspaceUtils::sizes_t nc_sizes; + MetaspaceUtils::sizes_t c_sizes; + MetaspaceUtils::get_all_sizes_synchronized(&nc_sizes, &c_sizes); + g_counters_total->update( + nc_sizes.reserved + c_sizes.reserved, + nc_sizes.committed + c_sizes.committed, + nc_sizes.used + c_sizes.used + ); + g_counters_class_space->update(c_sizes.reserved, c_sizes.committed, c_sizes.used); } else { - _perf_counters = new MetaspacePerfCounters(ns, 0, 0, 0, 0); + MetaspaceUtils::sizes_t nc_sizes; + MetaspaceUtils::get_all_sizes_synchronized(&nc_sizes, NULL); + g_counters_total->update(nc_sizes.reserved, nc_sizes.committed, nc_sizes.used); } } } diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/memory/metaspaceCounters.hpp --- a/src/hotspot/share/memory/metaspaceCounters.hpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/memory/metaspaceCounters.hpp Thu Jul 30 14:19:35 2020 +0200 @@ -27,26 +27,8 @@ #include "memory/allocation.hpp" -class MetaspacePerfCounters; - class MetaspaceCounters: public AllStatic { - static MetaspacePerfCounters* _perf_counters; - static size_t used(); - static size_t capacity(); - static size_t max_capacity(); - - public: - static void initialize_performance_counters(); - static void update_performance_counters(); -}; - -class CompressedClassSpaceCounters: public AllStatic { - static MetaspacePerfCounters* _perf_counters; - static size_t used(); - static size_t capacity(); - static size_t max_capacity(); - - public: + public: static void initialize_performance_counters(); static void update_performance_counters(); }; diff -r c35fba4bce35 -r bc85c1c2d80f src/hotspot/share/memory/universe.cpp --- a/src/hotspot/share/memory/universe.cpp Thu Jul 30 02:47:00 2020 -0400 +++ b/src/hotspot/share/memory/universe.cpp Thu Jul 30 14:19:35 2020 +0200 @@ -769,7 +769,6 @@ // Initialize performance counters for metaspaces MetaspaceCounters::initialize_performance_counters(); - CompressedClassSpaceCounters::initialize_performance_counters(); AOTLoader::universe_init();