From 5b887b8c85dda3ea2e685e4a5a3ec676fbfb99c7 Mon Sep 17 00:00:00 2001 From: Richard Reingruber Date: Wed, 5 Jul 2023 16:56:30 +0200 Subject: [PATCH] SapMachine #1438: Vitals: ClassLoaderDataGraph by SamplerThread is unsynchronized --- .../share/classfile/classLoaderData.cpp | 5 +++ .../share/classfile/classLoaderDataGraph.cpp | 4 ++ src/hotspot/share/vitals/vitals.cpp | 42 ++++++++----------- src/hotspot/share/vitals/vitals.hpp | 2 + 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp index d164c5f1555..7a39e299280 100644 --- a/src/hotspot/share/classfile/classLoaderData.cpp +++ b/src/hotspot/share/classfile/classLoaderData.cpp @@ -177,6 +177,11 @@ ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool has_class_mirror_ho NOT_PRODUCT(_dependency_count = 0); // number of class loader dependencies JFR_ONLY(INIT_ID(this);) + + // SapMachine 2023-07-04 : vitals + if (EnableVitals) { + sapmachine_vitals::counters::inc_cld_count(has_class_mirror_holder); + } } ClassLoaderData::ChunkedHandleList::~ChunkedHandleList() { diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp index 72a1e78838f..f4578667ce0 100644 --- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp +++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp @@ -515,6 +515,10 @@ bool ClassLoaderDataGraph::do_unloading() { } seen_dead_loader = true; loaders_removed++; + // SapMachine 2023-07-04 : vitals + if (EnableVitals) { + sapmachine_vitals::counters::dec_cld_count(data->has_class_mirror_holder()); + } ClassLoaderData* dead = data; dead->unload(); data = data->next(); diff --git a/src/hotspot/share/vitals/vitals.cpp b/src/hotspot/share/vitals/vitals.cpp index d3a12a46611..4926d351835 100644 --- a/src/hotspot/share/vitals/vitals.cpp +++ b/src/hotspot/share/vitals/vitals.cpp @@ -66,10 +66,26 @@ static Lock g_vitals_lock("VitalsLock"); namespace counters { +static volatile size_t g_number_of_clds = 0; +static volatile size_t g_number_of_anon_clds = 0; static volatile size_t g_classes_loaded = 0; static volatile size_t g_classes_unloaded = 0; static volatile size_t g_threads_created = 0; +void inc_cld_count(bool is_anon_cld) { + Atomic::inc(&g_number_of_clds); + if (is_anon_cld) { + Atomic::inc(&g_number_of_anon_clds); + } +} + +void dec_cld_count(bool is_anon_cld) { + Atomic::dec(&g_number_of_clds); + if (is_anon_cld) { + Atomic::dec(&g_number_of_anon_clds); + } +} + void inc_classes_loaded(size_t count) { Atomic::add(&g_classes_loaded, count); } @@ -1104,21 +1120,6 @@ static void set_value_in_sample(const Column* col, Sample* sample, T t) { } } -// Count CLDs -class CLDCounterClosure: public CLDClosure { -public: - int _cnt; - int _anon_cnt; - CLDCounterClosure() : _cnt(0), _anon_cnt(0) {} - void do_cld(ClassLoaderData* cld) { - _cnt ++; - if (cld->has_class_mirror_holder()) { - _anon_cnt ++; - } - } -}; - - struct nmt_values_t { // How much memory, in total, was committed via mmap value_t mapped_total; @@ -1234,15 +1235,8 @@ void sample_jvm_values(Sample* sample, bool avoid_locking) { } // CLDG - if (!avoid_locking) { - CLDCounterClosure cl; - { - MutexLocker lck(ClassLoaderDataGraph_lock); - ClassLoaderDataGraph::cld_do(&cl); - } - set_value_in_sample(g_col_number_of_clds, sample, cl._cnt); - set_value_in_sample(g_col_number_of_anon_clds, sample, cl._anon_cnt); - } + set_value_in_sample(g_col_number_of_clds, sample, counters::g_number_of_clds); + set_value_in_sample(g_col_number_of_anon_clds, sample, counters::g_number_of_anon_clds); // Classes set_value_in_sample(g_col_number_of_classes, sample, diff --git a/src/hotspot/share/vitals/vitals.hpp b/src/hotspot/share/vitals/vitals.hpp index 55b8b0d1539..8f2bb99827e 100644 --- a/src/hotspot/share/vitals/vitals.hpp +++ b/src/hotspot/share/vitals/vitals.hpp @@ -73,6 +73,8 @@ namespace sapmachine_vitals { const Thread* samplerthread(); namespace counters { + void inc_cld_count(bool is_anon_cld); + void dec_cld_count(bool is_anon_cld); void inc_classes_loaded(size_t count); void inc_classes_unloaded(size_t count); void inc_threads_created(size_t count);