diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp index c23f30a55e9d5..7c9fa7598355f 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp @@ -77,6 +77,10 @@ void ShenandoahAsserts::print_obj(ShenandoahMessageBuffer& msg, oop obj) { } msg.append(" mark:%s\n", mw_ss.freeze()); msg.append(" region: %s", ss.freeze()); + if (obj_klass == vmClasses::Class_klass()) { + msg.append(" mirrored klass: " PTR_FORMAT "\n", p2i(obj->metadata_field(java_lang_Class::klass_offset()))); + msg.append(" mirrored array klass: " PTR_FORMAT "\n", p2i(obj->metadata_field(java_lang_Class::array_klass_offset()))); + } } void ShenandoahAsserts::print_non_obj(ShenandoahMessageBuffer& msg, void* loc) { @@ -268,20 +272,22 @@ void ShenandoahAsserts::assert_correct(void* interior_loc, oop obj, const char* } // Do additional checks for special objects: their fields can hold metadata as well. - // We want to check class loading/unloading did not corrupt them. + // We want to check class loading/unloading did not corrupt them. We can only reasonably + // trust the forwarded objects, as the from-space object can have the klasses effectively + // dead. if (Universe::is_fully_initialized() && (obj_klass == vmClasses::Class_klass())) { - Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset()); + const Metadata* klass = fwd->metadata_field(java_lang_Class::klass_offset()); if (klass != nullptr && !Metaspace::contains(klass)) { print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed", - "Instance class mirror should point to Metaspace", + "Mirrored instance class should point to Metaspace", file, line); } - Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset()); + const Metadata* array_klass = fwd->metadata_field(java_lang_Class::array_klass_offset()); if (array_klass != nullptr && !Metaspace::contains(array_klass)) { print_failure(_safe_all, obj, interior_loc, nullptr, "Shenandoah assert_correct failed", - "Array class mirror should point to Metaspace", + "Mirrored array class should point to Metaspace", file, line); } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp index cdf7848520765..727b90e82a2a5 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp @@ -244,18 +244,20 @@ class ShenandoahVerifyOopClosure : public BasicOopIterateClosure { } // Do additional checks for special objects: their fields can hold metadata as well. - // We want to check class loading/unloading did not corrupt them. + // We want to check class loading/unloading did not corrupt them. We can only reasonably + // trust the forwarded objects, as the from-space object can have the klasses effectively + // dead. if (obj_klass == vmClasses::Class_klass()) { - Metadata* klass = obj->metadata_field(java_lang_Class::klass_offset()); + const Metadata* klass = fwd->metadata_field(java_lang_Class::klass_offset()); check(ShenandoahAsserts::_safe_oop, obj, klass == nullptr || Metaspace::contains(klass), - "Instance class mirror should point to Metaspace"); + "Mirrored instance class should point to Metaspace"); - Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset()); + const Metadata* array_klass = obj->metadata_field(java_lang_Class::array_klass_offset()); check(ShenandoahAsserts::_safe_oop, obj, array_klass == nullptr || Metaspace::contains(array_klass), - "Array class mirror should point to Metaspace"); + "Mirrored array class should point to Metaspace"); } // ------------ obj and fwd are safe at this point --------------