From f741349ffc23b4d5f4f1da94113933744223d40a Mon Sep 17 00:00:00 2001 From: Ashutosh Mehra Date: Thu, 4 Dec 2025 16:57:45 -0500 Subject: [PATCH 1/4] 8373114: Redundant MethodCounters in the preimage generated by training run Signed-off-by: Ashutosh Mehra --- src/hotspot/share/oops/method.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp index 1a2e5f0bee4e9..e75354c2dda0b 100644 --- a/src/hotspot/share/oops/method.cpp +++ b/src/hotspot/share/oops/method.cpp @@ -410,7 +410,7 @@ void Method::metaspace_pointers_do(MetaspaceClosure* it) { } it->push(&_adapter); it->push(&_method_data); - it->push(&_method_counters); + //it->push(&_method_counters); NOT_PRODUCT(it->push(&_name);) } @@ -425,9 +425,6 @@ void Method::remove_unshareable_info() { if (method_data() != nullptr) { method_data()->remove_unshareable_info(); } - if (method_counters() != nullptr) { - method_counters()->remove_unshareable_info(); - } if (CDSConfig::is_dumping_adapters() && _adapter != nullptr) { _adapter->remove_unshareable_info(); _adapter = nullptr; @@ -440,9 +437,6 @@ void Method::restore_unshareable_info(TRAPS) { if (method_data() != nullptr) { method_data()->restore_unshareable_info(CHECK); } - if (method_counters() != nullptr) { - method_counters()->restore_unshareable_info(CHECK); - } if (_adapter != nullptr) { assert(_adapter->is_linked(), "must be"); _from_compiled_entry = _adapter->get_c2i_entry(); From 41afeade08ffa61440a7d7ed1e22353cacb8f764 Mon Sep 17 00:00:00 2001 From: Ashutosh Mehra Date: Fri, 5 Dec 2025 11:20:04 -0500 Subject: [PATCH 2/4] Update Signed-off-by: Ashutosh Mehra --- src/hotspot/share/cds/archiveBuilder.cpp | 11 ++++++++++- src/hotspot/share/oops/method.cpp | 8 +++++++- src/hotspot/share/oops/methodCounters.cpp | 6 ++++++ src/hotspot/share/oops/methodCounters.hpp | 2 ++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index 3c7f25a950b38..34dae193d31d7 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -559,7 +559,16 @@ ArchiveBuilder::FollowMode ArchiveBuilder::get_follow_mode(MetaspaceClosure::Ref ref->msotype() == MetaspaceObj::KlassTrainingDataType || ref->msotype() == MetaspaceObj::MethodTrainingDataType || ref->msotype() == MetaspaceObj::CompileTrainingDataType) { - return (TrainingData::need_data() || TrainingData::assembling_data()) ? make_a_copy : set_to_null; + if (TrainingData::need_data() || TrainingData::assembling_data()) { + if (ref->msotype() == MetaspaceObj::MethodCountersType) { + MethodCounters* mcs = (MethodCounters*)obj; + return mcs->has_valid_method_training_data() ? make_a_copy : set_to_null; + } else { + return make_a_copy; + } + } else { + return set_to_null; + } } else if (ref->msotype() == MetaspaceObj::AdapterHandlerEntryType) { return CDSConfig::is_dumping_adapters() ? make_a_copy : set_to_null; } else { diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp index e75354c2dda0b..1a2e5f0bee4e9 100644 --- a/src/hotspot/share/oops/method.cpp +++ b/src/hotspot/share/oops/method.cpp @@ -410,7 +410,7 @@ void Method::metaspace_pointers_do(MetaspaceClosure* it) { } it->push(&_adapter); it->push(&_method_data); - //it->push(&_method_counters); + it->push(&_method_counters); NOT_PRODUCT(it->push(&_name);) } @@ -425,6 +425,9 @@ void Method::remove_unshareable_info() { if (method_data() != nullptr) { method_data()->remove_unshareable_info(); } + if (method_counters() != nullptr) { + method_counters()->remove_unshareable_info(); + } if (CDSConfig::is_dumping_adapters() && _adapter != nullptr) { _adapter->remove_unshareable_info(); _adapter = nullptr; @@ -437,6 +440,9 @@ void Method::restore_unshareable_info(TRAPS) { if (method_data() != nullptr) { method_data()->restore_unshareable_info(CHECK); } + if (method_counters() != nullptr) { + method_counters()->restore_unshareable_info(CHECK); + } if (_adapter != nullptr) { assert(_adapter->is_linked(), "must be"); _from_compiled_entry = _adapter->get_c2i_entry(); diff --git a/src/hotspot/share/oops/methodCounters.cpp b/src/hotspot/share/oops/methodCounters.cpp index 8f29f9b7bbde4..3f01f724d58b2 100644 --- a/src/hotspot/share/oops/methodCounters.cpp +++ b/src/hotspot/share/oops/methodCounters.cpp @@ -95,6 +95,12 @@ void MethodCounters::restore_unshareable_info(TRAPS) { } #endif // INCLUDE_CDS +bool MethodCounters::has_valid_method_training_data() { + Metadata* mtd = method_training_data(); + Metadata* mts = method_training_data_sentinel(); + return mtd != mts; +} + void MethodCounters::print_on(outputStream* st) const { assert(is_methodCounters(), "should be method counters"); st->print("method counters"); diff --git a/src/hotspot/share/oops/methodCounters.hpp b/src/hotspot/share/oops/methodCounters.hpp index 5733e6e61f096..f9fb9fe8de737 100644 --- a/src/hotspot/share/oops/methodCounters.hpp +++ b/src/hotspot/share/oops/methodCounters.hpp @@ -165,6 +165,8 @@ class MethodCounters : public Metadata { return false; } + bool has_valid_method_training_data(); + #if INCLUDE_CDS void remove_unshareable_info(); void restore_unshareable_info(TRAPS); From b6bbd8c8b0226070d56ba9c60086a85c7eb986f9 Mon Sep 17 00:00:00 2001 From: Ashutosh Mehra Date: Mon, 8 Dec 2025 20:54:28 -0500 Subject: [PATCH 3/4] Update fix Signed-off-by: Ashutosh Mehra --- src/hotspot/share/cds/archiveBuilder.cpp | 2 ++ src/hotspot/share/oops/metadata.hpp | 1 + src/hotspot/share/oops/trainingData.cpp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index 34dae193d31d7..de2f14155eb1a 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -560,6 +560,8 @@ ArchiveBuilder::FollowMode ArchiveBuilder::get_follow_mode(MetaspaceClosure::Ref ref->msotype() == MetaspaceObj::MethodTrainingDataType || ref->msotype() == MetaspaceObj::CompileTrainingDataType) { if (TrainingData::need_data() || TrainingData::assembling_data()) { + // Only add MethodCounters that are reachable via MethodTrainingData, + // i.e. MethodCounters associated with a valid MethodTrainingData. if (ref->msotype() == MetaspaceObj::MethodCountersType) { MethodCounters* mcs = (MethodCounters*)obj; return mcs->has_valid_method_training_data() ? make_a_copy : set_to_null; diff --git a/src/hotspot/share/oops/metadata.hpp b/src/hotspot/share/oops/metadata.hpp index 5a890a27fa1df..fa79e2400c162 100644 --- a/src/hotspot/share/oops/metadata.hpp +++ b/src/hotspot/share/oops/metadata.hpp @@ -45,6 +45,7 @@ class Metadata : public MetaspaceObj { virtual bool is_methodData() const { return false; } virtual bool is_constantPool() const { return false; } virtual bool is_methodCounters() const { return false; } + virtual int size() const = 0; virtual MetaspaceObj::Type type() const = 0; virtual const char* internal_name() const = 0; diff --git a/src/hotspot/share/oops/trainingData.cpp b/src/hotspot/share/oops/trainingData.cpp index 1a16fd70e446d..d049f6d0dd439 100644 --- a/src/hotspot/share/oops/trainingData.cpp +++ b/src/hotspot/share/oops/trainingData.cpp @@ -119,7 +119,7 @@ void TrainingData::verify() { MethodTrainingData* MethodTrainingData::make(const methodHandle& method, bool null_if_not_found, bool use_cache) { MethodTrainingData* mtd = nullptr; - if (!have_data() && !need_data()) { + if ((!have_data() && !need_data()) || (assembling_data() && !CDSConfig::is_at_aot_safepoint())) { return mtd; } // Try grabbing the cached value first. From 9bbb47894a83c1b0c638f43d4b2bced245ab88ac Mon Sep 17 00:00:00 2001 From: Ashutosh Mehra Date: Mon, 8 Dec 2025 21:32:51 -0500 Subject: [PATCH 4/4] Remove blank line Signed-off-by: Ashutosh Mehra --- src/hotspot/share/oops/metadata.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hotspot/share/oops/metadata.hpp b/src/hotspot/share/oops/metadata.hpp index fa79e2400c162..5a890a27fa1df 100644 --- a/src/hotspot/share/oops/metadata.hpp +++ b/src/hotspot/share/oops/metadata.hpp @@ -45,7 +45,6 @@ class Metadata : public MetaspaceObj { virtual bool is_methodData() const { return false; } virtual bool is_constantPool() const { return false; } virtual bool is_methodCounters() const { return false; } - virtual int size() const = 0; virtual MetaspaceObj::Type type() const = 0; virtual const char* internal_name() const = 0;