From 5291e1c1e1ddc19d814dbdb3a981049fe40575ea Mon Sep 17 00:00:00 2001 From: Stefan Karlsson Date: Wed, 26 Nov 2025 09:29:55 +0000 Subject: [PATCH] 8372513: Shenandoah: ShenandoahMaxRegionSize can produce an unaligned heap alignment Reviewed-by: jsikstro, eosterlund, shade --- .../share/gc/shenandoah/shenandoahArguments.cpp | 3 ++- src/hotspot/share/runtime/arguments.cpp | 1 + .../gc/shenandoah/options/TestRegionSizeArgs.java | 11 +++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp b/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp index a7cf8e638dd..c1fa4b964b7 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp @@ -37,6 +37,7 @@ #include "runtime/globals_extension.hpp" #include "runtime/java.hpp" #include "utilities/defaultStream.hpp" +#include "utilities/powerOfTwo.hpp" void ShenandoahArguments::initialize() { #if !(defined AARCH64 || defined AMD64 || defined PPC64 || defined RISCV64) @@ -205,7 +206,7 @@ void ShenandoahArguments::initialize() { } size_t ShenandoahArguments::conservative_max_heap_alignment() { - size_t align = ShenandoahMaxRegionSize; + size_t align = next_power_of_2(ShenandoahMaxRegionSize); if (UseLargePages) { align = MAX2(align, os::large_page_size()); } diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 55ee7641a5f..ff1de899bdd 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -1482,6 +1482,7 @@ void Arguments::set_conservative_max_heap_alignment() { os::vm_allocation_granularity(), os::max_page_size(), GCArguments::compute_heap_alignment()); + assert(is_power_of_2(_conservative_max_heap_alignment), "Expected to be a power-of-2"); } jint Arguments::set_ergonomics_flags() { diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestRegionSizeArgs.java b/test/hotspot/jtreg/gc/shenandoah/options/TestRegionSizeArgs.java index a8d5155584b..80962f0ffa6 100644 --- a/test/hotspot/jtreg/gc/shenandoah/options/TestRegionSizeArgs.java +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestRegionSizeArgs.java @@ -192,6 +192,17 @@ public class TestRegionSizeArgs { output.shouldHaveExitValue(0); } + // This used to assert that _conservative_max_heap_alignment is not a power-of-2. + { + OutputAnalyzer output = ProcessTools.executeLimitedTestJava("-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + "-Xms100m", + "-Xmx1g", + "-XX:ShenandoahMaxRegionSize=33m", + "-version"); + output.shouldHaveExitValue(0); + } + } private static void testMaxRegionSize() throws Exception {