From c494a00a66d21d2e403fd9ce253eb132c34e455d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Sikstr=C3=B6m?= Date: Mon, 7 Apr 2025 11:31:06 +0000 Subject: [PATCH] 8353559: Restructure CollectedHeap error printing Reviewed-by: stefank, eosterlund, ayang --- src/hotspot/share/gc/epsilon/epsilonHeap.cpp | 10 ++++++ src/hotspot/share/gc/epsilon/epsilonHeap.hpp | 3 +- src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 8 ++++- src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 2 +- .../gc/parallel/parallelScavengeHeap.cpp | 8 ++++- src/hotspot/share/gc/serial/serialHeap.cpp | 10 ++++++ src/hotspot/share/gc/serial/serialHeap.hpp | 3 +- src/hotspot/share/gc/shared/collectedHeap.cpp | 11 ------- src/hotspot/share/gc/shared/collectedHeap.hpp | 12 ++----- .../share/gc/shenandoah/shenandoahHeap.cpp | 12 +++---- .../share/gc/shenandoah/shenandoahHeap.hpp | 4 +-- src/hotspot/share/gc/z/zCollectedHeap.cpp | 28 +--------------- src/hotspot/share/gc/z/zCollectedHeap.hpp | 3 +- src/hotspot/share/gc/z/zHeap.cpp | 33 ++++++++++++++++++- src/hotspot/share/gc/z/zHeap.hpp | 6 ++-- src/hotspot/share/utilities/vmError.cpp | 2 ++ 16 files changed, 89 insertions(+), 66 deletions(-) diff --git a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp index 8bc98835844..d5ee7835fea 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 b2b522c1435..81bcd61916f 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 @@ public: 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 4c0436ad1e2..31f0cc12aa5 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 d1e81205cef..8d449ceedc6 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -1313,7 +1313,7 @@ private: 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 24cc30e1918..244094f1acc 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 fcf57909a03..ea2b656d4bd 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 754f6741cfe..2ec50814daf 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 @@ public: 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 2175b58b694..9c55a894ee7 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 31a224597a0..7b3fbd1a1c4 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 @@ protected: // 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 32acb42c765..c055a3f9b5a 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 d9508beac20..2bbb590f355 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 @@ public: 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 29111062529..828e3c9d033 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 434204e16b8..08aa7d40a3f 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 @@ public: 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 bca9e2f8c41..e0f4cb65303 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 4bf4727c3e3..25cd2209003 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 @@ public: // 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 bbf1fcf9d6f..ef04d69ee99 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()));