diff --git a/src/hotspot/share/oops/klass.cpp b/src/hotspot/share/oops/klass.cpp index 2a28978816d..8eb54696f6b 100644 --- a/src/hotspot/share/oops/klass.cpp +++ b/src/hotspot/share/oops/klass.cpp @@ -61,10 +61,6 @@ void Klass::set_java_mirror(Handle m) { _java_mirror = class_loader_data()->add_handle(m); } -oop Klass::java_mirror_no_keepalive() const { - return _java_mirror.peek(); -} - bool Klass::is_cloneable() const { return _access_flags.is_cloneable_fast() || is_subtype_of(vmClasses::Cloneable_klass()); diff --git a/src/hotspot/share/oops/klass.inline.hpp b/src/hotspot/share/oops/klass.inline.hpp index af2480e149b..a72868a08d8 100644 --- a/src/hotspot/share/oops/klass.inline.hpp +++ b/src/hotspot/share/oops/klass.inline.hpp @@ -56,6 +56,10 @@ inline oop Klass::java_mirror() const { return _java_mirror.resolve(); } +inline oop Klass::java_mirror_no_keepalive() const { + return _java_mirror.peek(); +} + inline klassVtable Klass::vtable() const { return klassVtable(const_cast(this), start_of_vtable(), vtable_length() / vtableEntry::size()); } diff --git a/src/hotspot/share/services/heapDumper.cpp b/src/hotspot/share/services/heapDumper.cpp index 027974032cd..18b91b6f289 100644 --- a/src/hotspot/share/services/heapDumper.cpp +++ b/src/hotspot/share/services/heapDumper.cpp @@ -778,15 +778,30 @@ class DumperSupport : AllStatic { // fixes up the current dump record and writes HPROF_HEAP_DUMP_END record static void end_of_dump(AbstractDumpWriter* writer); - static oop mask_dormant_archived_object(oop o) { - if (o != nullptr && o->klass()->java_mirror() == nullptr) { + static oop mask_dormant_archived_object(oop o, oop ref_obj) { + if (o != nullptr && o->klass()->java_mirror_no_keepalive() == nullptr) { // Ignore this object since the corresponding java mirror is not loaded. // Might be a dormant archive object. + report_dormant_archived_object(o, ref_obj); return nullptr; } else { return o; } } + + static void report_dormant_archived_object(oop o, oop ref_obj) { + if (log_is_enabled(Trace, cds, heap)) { + ResourceMark rm; + if (ref_obj != nullptr) { + log_trace(cds, heap)("skipped dormant archived object " INTPTR_FORMAT " (%s) referenced by " INTPTR_FORMAT " (%s)", + p2i(o), o->klass()->external_name(), + p2i(ref_obj), ref_obj->klass()->external_name()); + } else { + log_trace(cds, heap)("skipped dormant archived object " INTPTR_FORMAT " (%s)", + p2i(o), o->klass()->external_name()); + } + } + } }; // Hash table of klasses to the klass metadata. This should greatly improve the @@ -974,13 +989,7 @@ void DumperSupport::dump_field_value(AbstractDumpWriter* writer, char type, oop case JVM_SIGNATURE_CLASS : case JVM_SIGNATURE_ARRAY : { oop o = obj->obj_field_access(offset); - if (o != nullptr && log_is_enabled(Debug, cds, heap) && mask_dormant_archived_object(o) == nullptr) { - ResourceMark rm; - log_debug(cds, heap)("skipped dormant archived object " INTPTR_FORMAT " (%s) referenced by " INTPTR_FORMAT " (%s)", - p2i(o), o->klass()->external_name(), - p2i(obj), obj->klass()->external_name()); - } - o = mask_dormant_archived_object(o); + o = mask_dormant_archived_object(o, obj); assert(oopDesc::is_oop_or_null(o), "Expected an oop or nullptr at " PTR_FORMAT, p2i(o)); writer->write_objectID(o); break; @@ -1312,13 +1321,7 @@ void DumperSupport::dump_object_array(AbstractDumpWriter* writer, objArrayOop ar // [id]* elements for (int index = 0; index < length; index++) { oop o = array->obj_at(index); - if (o != nullptr && log_is_enabled(Debug, cds, heap) && mask_dormant_archived_object(o) == nullptr) { - ResourceMark rm; - log_debug(cds, heap)("skipped dormant archived object " INTPTR_FORMAT " (%s) referenced by " INTPTR_FORMAT " (%s)", - p2i(o), o->klass()->external_name(), - p2i(array), array->klass()->external_name()); - } - o = mask_dormant_archived_object(o); + o = mask_dormant_archived_object(o, array); writer->write_objectID(o); } @@ -1885,8 +1888,7 @@ void HeapObjectDumper::do_object(oop o) { } } - if (DumperSupport::mask_dormant_archived_object(o) == nullptr) { - log_debug(cds, heap)("skipped dormant archived object " INTPTR_FORMAT " (%s)", p2i(o), o->klass()->external_name()); + if (DumperSupport::mask_dormant_archived_object(o, nullptr) == nullptr) { return; }