From a9bd1ad40cb4e275d83b2e8b15e3c4be1551f7fc Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Wed, 9 Jul 2025 08:56:44 +0000 Subject: [PATCH] 8361520: Stabilize SystemGC benchmarks Reviewed-by: tschatzl, ayang --- .../org/openjdk/bench/vm/gc/systemgc/AllDead.java | 10 ++++++++++ .../org/openjdk/bench/vm/gc/systemgc/AllLive.java | 10 ++++++++++ .../vm/gc/systemgc/DifferentObjectSizesArray.java | 10 ++++++++++ .../gc/systemgc/DifferentObjectSizesHashMap.java | 10 ++++++++++ .../gc/systemgc/DifferentObjectSizesTreeMap.java | 10 ++++++++++ .../bench/vm/gc/systemgc/HalfDeadFirstPart.java | 10 ++++++++++ .../bench/vm/gc/systemgc/HalfDeadInterleaved.java | 10 ++++++++++ .../vm/gc/systemgc/HalfDeadInterleavedChunks.java | 10 ++++++++++ .../bench/vm/gc/systemgc/HalfDeadSecondPart.java | 10 ++++++++++ .../bench/vm/gc/systemgc/HalfHashedHalfDead.java | 10 ++++++++++ .../openjdk/bench/vm/gc/systemgc/NoObjects.java | 15 +++++++++++++++ .../bench/vm/gc/systemgc/OneBigObject.java | 10 ++++++++++ 12 files changed, 125 insertions(+) diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/AllDead.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/AllDead.java index 6e41ec0610e..5e1ef72f2c3 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/AllDead.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/AllDead.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -49,6 +53,12 @@ public class AllDead { static ArrayList holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = GarbageGenerator.generateObjectArrays(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/AllLive.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/AllLive.java index 2a2bf060833..bc62d838f57 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/AllLive.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/AllLive.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -49,6 +53,12 @@ public class AllLive { static ArrayList holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = GarbageGenerator.generateObjectArrays(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesArray.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesArray.java index 4de7c4a8f84..2591b23763a 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesArray.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesArray.java @@ -26,15 +26,19 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -49,6 +53,12 @@ public class DifferentObjectSizesArray { static Object[] largeObjArray; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { largeObjArray = GarbageGenerator.generateAndFillLargeObjArray(false); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesHashMap.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesHashMap.java index 960223f5035..9dd39bcf783 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesHashMap.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesHashMap.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.HashMap; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -50,6 +54,12 @@ public class DifferentObjectSizesHashMap { static HashMap largeMap; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { largeMap = GarbageGenerator.generateAndFillHashMap(false); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesTreeMap.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesTreeMap.java index d1fea505ac0..6fd1fe05555 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesTreeMap.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/DifferentObjectSizesTreeMap.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.TreeMap; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -49,6 +53,12 @@ public class DifferentObjectSizesTreeMap { */ static TreeMap largeMap; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { largeMap = GarbageGenerator.generateAndFillTreeMap(false); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadFirstPart.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadFirstPart.java index 339e31d7032..ef62a269acb 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadFirstPart.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadFirstPart.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -50,6 +54,12 @@ public class HalfDeadFirstPart { static ArrayList holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = GarbageGenerator.generateObjectArrays(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleaved.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleaved.java index 07eda82f2c9..471d86b88cb 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleaved.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleaved.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -50,6 +54,12 @@ public class HalfDeadInterleaved { static ArrayList holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = GarbageGenerator.generateObjectArrays(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleavedChunks.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleavedChunks.java index a5d6dce91a9..bcf495cfd5f 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleavedChunks.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadInterleavedChunks.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -50,6 +54,12 @@ public class HalfDeadInterleavedChunks { static ArrayList holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = GarbageGenerator.generateObjectArrays(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadSecondPart.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadSecondPart.java index 838aeb4820b..9340d1047ce 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadSecondPart.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfDeadSecondPart.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -50,6 +54,12 @@ public class HalfDeadSecondPart { static ArrayList holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = GarbageGenerator.generateObjectArrays(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfHashedHalfDead.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfHashedHalfDead.java index eaba46e04e9..c48bc5b1d15 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfHashedHalfDead.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/HalfHashedHalfDead.java @@ -26,16 +26,20 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.ArrayList; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -50,6 +54,12 @@ public class HalfHashedHalfDead { static ArrayList holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = GarbageGenerator.generateObjectArrays(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/NoObjects.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/NoObjects.java index 96461c8106c..6f31c4014a8 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/NoObjects.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/NoObjects.java @@ -25,14 +25,23 @@ package org.openjdk.bench.vm.gc.systemgc; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) public class NoObjects { /* @@ -43,6 +52,12 @@ public class NoObjects { * test for consistency. */ + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Benchmark public void gc() { System.gc(); diff --git a/test/micro/org/openjdk/bench/vm/gc/systemgc/OneBigObject.java b/test/micro/org/openjdk/bench/vm/gc/systemgc/OneBigObject.java index ef2c436efd7..2a213fe795b 100644 --- a/test/micro/org/openjdk/bench/vm/gc/systemgc/OneBigObject.java +++ b/test/micro/org/openjdk/bench/vm/gc/systemgc/OneBigObject.java @@ -26,15 +26,19 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.SingleShotTime) +@Warmup(iterations = 5) +@Measurement(iterations = 5) @Fork(value=25, jvmArgs={"-Xmx5g", "-Xms5g", "-Xmn3g", "-XX:+AlwaysPreTouch"}) @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @@ -49,6 +53,12 @@ public class OneBigObject { static Object[] holder; + @Setup(Level.Trial) + public void preRun() { + // Compact right now, kicking out all unrelated objects + System.gc(); + } + @Setup(Level.Iteration) public void generateGarbage() { holder = new Object[1024*1024*128];