diff a/test/hotspot/jtreg/serviceability/sa/TestG1HeapRegion.java b/test/hotspot/jtreg/serviceability/sa/TestG1HeapRegion.java --- a/test/hotspot/jtreg/serviceability/sa/TestG1HeapRegion.java +++ b/test/hotspot/jtreg/serviceability/sa/TestG1HeapRegion.java @@ -1,7 +1,7 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. @@ -20,12 +20,14 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import sun.jvm.hotspot.debugger.Address; import sun.jvm.hotspot.gc.g1.G1CollectedHeap; import sun.jvm.hotspot.gc.g1.G1HeapRegion; import sun.jvm.hotspot.HotSpotAgent; import sun.jvm.hotspot.runtime.VM; @@ -37,15 +39,17 @@ import jdk.test.lib.SA.SATestUtils; import jdk.test.lib.Utils; /** * @test + * @bug 8194249 * @library /test/lib * @requires vm.hasSA * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @requires vm.gc.G1 * @modules jdk.hotspot.agent/sun.jvm.hotspot + * jdk.hotspot.agent/sun.jvm.hotspot.debugger * jdk.hotspot.agent/sun.jvm.hotspot.gc.g1 * jdk.hotspot.agent/sun.jvm.hotspot.memory * jdk.hotspot.agent/sun.jvm.hotspot.runtime * @run driver TestG1HeapRegion */ @@ -57,16 +61,44 @@ private static void checkHeapRegion(String pid) throws Exception { HotSpotAgent agent = new HotSpotAgent(); try { agent.attach(Integer.parseInt(pid)); + G1CollectedHeap heap = (G1CollectedHeap)VM.getVM().getUniverse().heap(); - G1HeapRegion hr = heap.hrm().heapRegionIterator().next(); - G1HeapRegion hrTop = heap.hrm().getByAddress(hr.top()); + heap.printOn(System.out); + + // Print each region first. + System.out.println(); + Iterator hri = heap.hrm().heapRegionIterator(); + G1HeapRegion hr = hri.next(); + while (hr != null) { + hr.printOn(System.out); + hr = hri.next(); + } + System.out.println(); - Asserts.assertEquals(hr.top(), hrTop.top(), - "Address of G1HeapRegion does not match."); + // Iterate over each region and confirm that getByAddress(top) returns + // the same address as the region being looked at. + hri = heap.hrm().heapRegionIterator(); + hr = hri.next(); + while (hr != null) { + hr.printOn(System.out); + Address top = hr.top(); + if (top.equals(hr.end())) { + // The end of the region is actually the first address after + // the end, so it points to the start of the next region. We need to + // subtract to avoid getByAddress(top) returning the next region. + top = top.addOffsetTo(-1); + } + G1HeapRegion hrTop = heap.hrm().getByAddress(top); + System.out.format("hr.top():0x%x <--> hrTop.top():0x%x\n", + hr.top().asLongValue(), hrTop.top().asLongValue()); + Asserts.assertEquals(hr.top(), hrTop.top(), + "Address of G1HeapRegion does not match."); + hr = hri.next(); + } } finally { agent.detach(); } } @@ -74,10 +106,11 @@ throws Exception { // Start a new process to attach to the lingered app ProcessBuilder processBuilder = ProcessTools.createLimitedTestJavaProcessBuilder( "--add-modules=jdk.hotspot.agent", "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED", + "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.debugger=ALL-UNNAMED", "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.gc.g1=ALL-UNNAMED", "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED", "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED", "TestG1HeapRegion", Long.toString(lingeredAppPid));