diff -r c6cbcc673cd3 -r 7909763ad193 src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSet.cpp --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSet.cpp Thu Oct 24 16:28:51 2019 +0200 +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSet.cpp Thu Oct 24 16:37:22 2019 +0200 @@ -204,9 +204,14 @@ return write_klass(writer, klass, true); } +static bool is_implied(const Klass* klass) { + assert(klass != NULL, "invariant"); + return klass->is_subclass_of(SystemDictionary::ClassLoader_klass()) || klass == SystemDictionary::Object_klass(); +} + static void do_implied(Klass* klass) { assert(klass != NULL, "invariant"); - if (klass->is_subclass_of(SystemDictionary::ClassLoader_klass()) || klass == SystemDictionary::Object_klass()) { + if (is_implied(klass)) { if (_leakp_writer != NULL) { SET_LEAKP(klass); } @@ -259,6 +264,16 @@ typedef CompositeFunctor KlassWriterRegistration; typedef JfrArtifactCallbackHost KlassCallback; +template <> +class LeakPredicate { +public: + LeakPredicate(bool class_unload) {} + bool operator()(const Klass* klass) { + assert(klass != NULL, "invariant"); + return IS_LEAKP(klass) || is_implied(klass); + } +}; + typedef LeakPredicate LeakKlassPredicate; typedef JfrPredicatedTypeWriterImplHost LeakKlassWriterImpl; typedef JfrTypeWriterHost LeakKlassWriter; @@ -809,6 +824,12 @@ _artifacts->tally(sw); } +static bool clear_artifacts = false; + +void JfrTypeSet::clear() { + clear_artifacts = true; +} + typedef Wrapper ClearKlassBits; typedef Wrapper ClearMethodFlag; typedef MethodIteratorHost ClearKlassAndMethods; @@ -820,7 +841,7 @@ assert(_writer != NULL, "invariant"); ClearKlassAndMethods clear(_writer); _artifacts->iterate_klasses(clear); - _artifacts->clear(); + JfrTypeSet::clear(); ++checkpoint_id; } return total_count; @@ -833,8 +854,9 @@ if (_artifacts == NULL) { _artifacts = new JfrArtifactSet(class_unload); } else { - _artifacts->initialize(class_unload); + _artifacts->initialize(class_unload, clear_artifacts); } + clear_artifacts = false; assert(_artifacts != NULL, "invariant"); assert(!_artifacts->has_klass_entries(), "invariant"); }