diff --git a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp index 8bc98835844ed..d5ee7835fea0d 100644 --- a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp +++ b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp @@ -310,6 +310,16 @@ void EpsilonHeap::print_on(outputStream *st) const { MetaspaceUtils::print_on(st); } +void EpsilonHeap::print_on_error(outputStream *st) const { + print_on(st); + st->cr(); + + BarrierSet* bs = BarrierSet::barrier_set(); + if (bs != nullptr) { + bs->print_on(st); + } +} + bool EpsilonHeap::print_location(outputStream* st, void* addr) const { return BlockLocationPrinter::print_location(st, addr); } diff --git a/src/hotspot/share/gc/epsilon/epsilonHeap.hpp b/src/hotspot/share/gc/epsilon/epsilonHeap.hpp index b2b522c1435e6..81bcd61916fe6 100644 --- a/src/hotspot/share/gc/epsilon/epsilonHeap.hpp +++ b/src/hotspot/share/gc/epsilon/epsilonHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, 2022, Red Hat, Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -132,6 +132,7 @@ class EpsilonHeap : public CollectedHeap { HeapWord* allocate_loaded_archive_space(size_t size) override; void print_on(outputStream* st) const override; + void print_on_error(outputStream* st) const override; void print_tracing_info() const override; bool print_location(outputStream* st, void* addr) const override; diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index 4c0436ad1e224..31f0cc12aa5ee 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -2161,7 +2161,13 @@ void G1CollectedHeap::print_extended_on(outputStream* st) const { } void G1CollectedHeap::print_on_error(outputStream* st) const { - this->CollectedHeap::print_on_error(st); + print_extended_on(st); + st->cr(); + + BarrierSet* bs = BarrierSet::barrier_set(); + if (bs != nullptr) { + bs->print_on(st); + } if (_cm != nullptr) { st->cr(); diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp index d1e81205cefb7..8d449ceedc6d1 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -1313,7 +1313,7 @@ class G1CollectedHeap : public CollectedHeap { public: void print_on(outputStream* st) const override; - void print_extended_on(outputStream* st) const override; + void print_extended_on(outputStream* st) const; void print_on_error(outputStream* st) const override; void gc_threads_do(ThreadClosure* tc) const override; diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index 24cc30e191811..244094f1acc78 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -673,7 +673,13 @@ void ParallelScavengeHeap::print_on(outputStream* st) const { } void ParallelScavengeHeap::print_on_error(outputStream* st) const { - this->CollectedHeap::print_on_error(st); + print_on(st); + st->cr(); + + BarrierSet* bs = BarrierSet::barrier_set(); + if (bs != nullptr) { + bs->print_on(st); + } st->cr(); PSParallelCompact::print_on_error(st); diff --git a/src/hotspot/share/gc/serial/serialHeap.cpp b/src/hotspot/share/gc/serial/serialHeap.cpp index fcf57909a032e..ea2b656d4bd01 100644 --- a/src/hotspot/share/gc/serial/serialHeap.cpp +++ b/src/hotspot/share/gc/serial/serialHeap.cpp @@ -810,6 +810,16 @@ void SerialHeap::print_on(outputStream* st) const { MetaspaceUtils::print_on(st); } +void SerialHeap::print_on_error(outputStream* st) const { + print_on(st); + st->cr(); + + BarrierSet* bs = BarrierSet::barrier_set(); + if (bs != nullptr) { + bs->print_on(st); + } +} + void SerialHeap::gc_threads_do(ThreadClosure* tc) const { } diff --git a/src/hotspot/share/gc/serial/serialHeap.hpp b/src/hotspot/share/gc/serial/serialHeap.hpp index 754f6741cfec3..2ec50814daf55 100644 --- a/src/hotspot/share/gc/serial/serialHeap.hpp +++ b/src/hotspot/share/gc/serial/serialHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -207,6 +207,7 @@ class SerialHeap : public CollectedHeap { void verify(VerifyOption option) override; void print_on(outputStream* st) const override; + void print_on_error(outputStream* st) const override; void gc_threads_do(ThreadClosure* tc) const override; void print_tracing_info() const override; diff --git a/src/hotspot/share/gc/shared/collectedHeap.cpp b/src/hotspot/share/gc/shared/collectedHeap.cpp index 2175b58b694d3..9c55a894ee702 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.cpp +++ b/src/hotspot/share/gc/shared/collectedHeap.cpp @@ -188,17 +188,6 @@ void CollectedHeap::print_heap_after_gc() { void CollectedHeap::print() const { print_on(tty); } -void CollectedHeap::print_on_error(outputStream* st) const { - st->print_cr("Heap:"); - print_extended_on(st); - st->cr(); - - BarrierSet* bs = BarrierSet::barrier_set(); - if (bs != nullptr) { - bs->print_on(st); - } -} - void CollectedHeap::trace_heap(GCWhen::Type when, const GCTracer* gc_tracer) { const GCHeapSummary& heap_summary = create_heap_summary(); gc_tracer->report_gc_heap_summary(when, heap_summary); diff --git a/src/hotspot/share/gc/shared/collectedHeap.hpp b/src/hotspot/share/gc/shared/collectedHeap.hpp index 31a224597a048..7b3fbd1a1c483 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.hpp +++ b/src/hotspot/share/gc/shared/collectedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -440,15 +440,7 @@ class CollectedHeap : public CHeapObj { // The default behavior is to call print_on() on tty. virtual void print() const; - // Print more detailed heap information on the given - // outputStream. The default behavior is to call print_on(). It is - // up to each subclass to override it and add any additional output - // it needs. - virtual void print_extended_on(outputStream* st) const { - print_on(st); - } - - virtual void print_on_error(outputStream* st) const; + virtual void print_on_error(outputStream* st) const = 0; // Used to print information about locations in the hs_err file. virtual bool print_location(outputStream* st, void* addr) const = 0; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index 32acb42c76538..c055a3f9b5a9d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -649,6 +649,12 @@ void ShenandoahHeap::print_on(outputStream* st) const { } } +void ShenandoahHeap::print_on_error(outputStream* st) const { + print_on(st); + st->cr(); + print_heap_regions_on(st); +} + class ShenandoahInitWorkerGCLABClosure : public ThreadClosure { public: void do_thread(Thread* thread) { @@ -2582,12 +2588,6 @@ void ShenandoahHeap::rebuild_free_set(bool concurrent) { } } -void ShenandoahHeap::print_extended_on(outputStream *st) const { - print_on(st); - st->cr(); - print_heap_regions_on(st); -} - bool ShenandoahHeap::is_bitmap_slice_committed(ShenandoahHeapRegion* r, bool skip_self) { size_t slice = r->index() / _bitmap_regions_per_slice; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp index d9508beac202c..2bbb590f3552d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2021, Red Hat, Inc. All rights reserved. * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -203,7 +203,7 @@ class ShenandoahHeap : public CollectedHeap { void initialize_serviceability() override; void print_on(outputStream* st) const override; - void print_extended_on(outputStream *st) const override; + void print_on_error(outputStream *st) const override; void print_tracing_info() const override; void print_heap_regions_on(outputStream* st) const; diff --git a/src/hotspot/share/gc/z/zCollectedHeap.cpp b/src/hotspot/share/gc/z/zCollectedHeap.cpp index 2911106252913..828e3c9d033b2 100644 --- a/src/hotspot/share/gc/z/zCollectedHeap.cpp +++ b/src/hotspot/share/gc/z/zCollectedHeap.cpp @@ -359,33 +359,7 @@ void ZCollectedHeap::print_on(outputStream* st) const { } void ZCollectedHeap::print_on_error(outputStream* st) const { - st->print_cr("ZGC Globals:"); - st->print_cr(" Young Collection: %s/%u", ZGeneration::young()->phase_to_string(), ZGeneration::young()->seqnum()); - st->print_cr(" Old Collection: %s/%u", ZGeneration::old()->phase_to_string(), ZGeneration::old()->seqnum()); - st->print_cr(" Offset Max: " EXACTFMT " (" PTR_FORMAT ")", EXACTFMTARGS(ZAddressOffsetMax), ZAddressOffsetMax); - st->print_cr(" Page Size Small: %zuM", ZPageSizeSmall / M); - st->print_cr(" Page Size Medium: %zuM", ZPageSizeMedium / M); - st->cr(); - st->print_cr("ZGC Metadata Bits:"); - st->print_cr(" LoadGood: " PTR_FORMAT, ZPointerLoadGoodMask); - st->print_cr(" LoadBad: " PTR_FORMAT, ZPointerLoadBadMask); - st->print_cr(" MarkGood: " PTR_FORMAT, ZPointerMarkGoodMask); - st->print_cr(" MarkBad: " PTR_FORMAT, ZPointerMarkBadMask); - st->print_cr(" StoreGood: " PTR_FORMAT, ZPointerStoreGoodMask); - st->print_cr(" StoreBad: " PTR_FORMAT, ZPointerStoreBadMask); - st->print_cr(" ------------------- "); - st->print_cr(" Remapped: " PTR_FORMAT, ZPointerRemapped); - st->print_cr(" RemappedYoung: " PTR_FORMAT, ZPointerRemappedYoungMask); - st->print_cr(" RemappedOld: " PTR_FORMAT, ZPointerRemappedOldMask); - st->print_cr(" MarkedYoung: " PTR_FORMAT, ZPointerMarkedYoung); - st->print_cr(" MarkedOld: " PTR_FORMAT, ZPointerMarkedOld); - st->print_cr(" Remembered: " PTR_FORMAT, ZPointerRemembered); - st->cr(); - CollectedHeap::print_on_error(st); -} - -void ZCollectedHeap::print_extended_on(outputStream* st) const { - _heap.print_extended_on(st); + _heap.print_on_error(st); } void ZCollectedHeap::print_tracing_info() const { diff --git a/src/hotspot/share/gc/z/zCollectedHeap.hpp b/src/hotspot/share/gc/z/zCollectedHeap.hpp index 434204e16b80d..08aa7d40a3f9d 100644 --- a/src/hotspot/share/gc/z/zCollectedHeap.hpp +++ b/src/hotspot/share/gc/z/zCollectedHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -117,7 +117,6 @@ class ZCollectedHeap : public CollectedHeap { void print_on(outputStream* st) const override; void print_on_error(outputStream* st) const override; - void print_extended_on(outputStream* st) const override; void print_tracing_info() const override; bool print_location(outputStream* st, void* addr) const override; diff --git a/src/hotspot/share/gc/z/zHeap.cpp b/src/hotspot/share/gc/z/zHeap.cpp index bca9e2f8c4156..e0f4cb6530370 100644 --- a/src/hotspot/share/gc/z/zHeap.cpp +++ b/src/hotspot/share/gc/z/zHeap.cpp @@ -326,10 +326,41 @@ void ZHeap::print_on(outputStream* st) const { MetaspaceUtils::print_on(st); } -void ZHeap::print_extended_on(outputStream* st) const { +void ZHeap::print_on_error(outputStream* st) const { print_on(st); st->cr(); + print_globals_on(st); + st->cr(); + + print_page_table_on(st); +} + +void ZHeap::print_globals_on(outputStream* st) const { + st->print_cr("ZGC Globals:"); + st->print_cr(" Young Collection: %s/%u", ZGeneration::young()->phase_to_string(), ZGeneration::young()->seqnum()); + st->print_cr(" Old Collection: %s/%u", ZGeneration::old()->phase_to_string(), ZGeneration::old()->seqnum()); + st->print_cr(" Offset Max: " EXACTFMT " (" PTR_FORMAT ")", EXACTFMTARGS(ZAddressOffsetMax), ZAddressOffsetMax); + st->print_cr(" Page Size Small: %zuM", ZPageSizeSmall / M); + st->print_cr(" Page Size Medium: %zuM", ZPageSizeMedium / M); + st->cr(); + st->print_cr("ZGC Metadata Bits:"); + st->print_cr(" LoadGood: " PTR_FORMAT, ZPointerLoadGoodMask); + st->print_cr(" LoadBad: " PTR_FORMAT, ZPointerLoadBadMask); + st->print_cr(" MarkGood: " PTR_FORMAT, ZPointerMarkGoodMask); + st->print_cr(" MarkBad: " PTR_FORMAT, ZPointerMarkBadMask); + st->print_cr(" StoreGood: " PTR_FORMAT, ZPointerStoreGoodMask); + st->print_cr(" StoreBad: " PTR_FORMAT, ZPointerStoreBadMask); + st->print_cr(" ------------------- "); + st->print_cr(" Remapped: " PTR_FORMAT, ZPointerRemapped); + st->print_cr(" RemappedYoung: " PTR_FORMAT, ZPointerRemappedYoungMask); + st->print_cr(" RemappedOld: " PTR_FORMAT, ZPointerRemappedOldMask); + st->print_cr(" MarkedYoung: " PTR_FORMAT, ZPointerMarkedYoung); + st->print_cr(" MarkedOld: " PTR_FORMAT, ZPointerMarkedOld); + st->print_cr(" Remembered: " PTR_FORMAT, ZPointerRemembered); +} + +void ZHeap::print_page_table_on(outputStream* st) const { // Do not allow pages to be deleted _page_allocator.enable_safe_destroy(); diff --git a/src/hotspot/share/gc/z/zHeap.hpp b/src/hotspot/share/gc/z/zHeap.hpp index 4bf4727c3e35c..25cd22090030e 100644 --- a/src/hotspot/share/gc/z/zHeap.hpp +++ b/src/hotspot/share/gc/z/zHeap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -132,7 +132,9 @@ class ZHeap { // Printing void print_on(outputStream* st) const; - void print_extended_on(outputStream* st) const; + void print_on_error(outputStream* st) const; + void print_globals_on(outputStream* st) const; + void print_page_table_on(outputStream* st) const; bool print_location(outputStream* st, uintptr_t addr) const; bool print_location(outputStream* st, zaddress addr) const; bool print_location(outputStream* st, zpointer ptr) const; diff --git a/src/hotspot/share/utilities/vmError.cpp b/src/hotspot/share/utilities/vmError.cpp index bbf1fcf9d6f49..ef04d69ee995c 100644 --- a/src/hotspot/share/utilities/vmError.cpp +++ b/src/hotspot/share/utilities/vmError.cpp @@ -1191,6 +1191,7 @@ void VMError::report(outputStream* st, bool _verbose) { GCLogPrecious::print_on_error(st); if (Universe::heap() != nullptr) { + st->print_cr("Heap:"); Universe::heap()->print_on_error(st); st->cr(); } @@ -1374,6 +1375,7 @@ void VMError::print_vm_info(outputStream* st) { if (Universe::is_fully_initialized()) { MutexLocker hl(Heap_lock); GCLogPrecious::print_on_error(st); + st->print_cr("Heap:"); Universe::heap()->print_on_error(st); st->cr(); st->print_cr("Polling page: " PTR_FORMAT, p2i(SafepointMechanism::get_polling_page()));