Skip to content

Commit 577401d

Browse files
authored
Support Generational Shenandoah GC metrics (#6545)
Generational Shenandoah is an experimental feature in Java 24 and a GA feature in Java 25. This adds support for it to JvmGcMetrics. Run GC tests with generational Shenandoah on JDK 24 for now. When we have a JDK 25 build, we can use that and remove the experimental option. Resolves gh-4259
1 parent ce7f629 commit 577401d

File tree

4 files changed

+20
-3
lines changed

4 files changed

+20
-3
lines changed

.circleci/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ jobs:
7171
executor: jdk24-executor
7272
steps:
7373
- gradlew-build
74+
- run: ./gradlew generationalShenandoahTest
7475

7576
build:
7677
executor: circle-jdk-executor

micrometer-core/build.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,17 @@ tasks.register("shenandoahTest", Test) {
239239
jvmArgs '-XX:+UseShenandoahGC'
240240
}
241241

242+
tasks.register("generationalShenandoahTest", Test) {
243+
// set heap size for the test JVM(s)
244+
maxHeapSize = "1500m"
245+
246+
useJUnitPlatform {
247+
includeTags 'gc'
248+
}
249+
250+
jvmArgs '-XX:+UseShenandoahGC', '-XX:+UnlockExperimentalVMOptions', '-XX:ShenandoahGCMode=generational'
251+
}
252+
242253
tasks.register("zgcTest", Test) {
243254
// set heap size for the test JVM(s)
244255
maxHeapSize = "1500m"

micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmGcMetrics.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ private boolean shouldUpdateDataSizeMetrics(String gcName) {
277277
}
278278

279279
private boolean isMajorGenerationalGc(String gcName) {
280-
return GcGenerationAge.fromGcName(gcName) == GcGenerationAge.OLD;
280+
return isGenerationalGc && GcGenerationAge.fromGcName(gcName) == GcGenerationAge.OLD;
281281
}
282282

283283
private boolean nonGenerationalGcShouldUpdateDataSize(String gcName) {
@@ -392,6 +392,7 @@ enum GcGenerationAge {
392392
knownCollectors.put("GPGC Old Pauses", OLD); // new naming
393393
// do not include 'ZGC Major Pauses'; see gh-2872
394394
knownCollectors.put("ZGC Major Cycles", OLD);
395+
knownCollectors.put("Shenandoah Cycles", OLD);
395396
}
396397

397398
static GcGenerationAge fromGcName(String gcName) {

micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmMemory.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ static boolean isConcurrentPhase(String cause, String name) {
4545
}
4646

4747
static boolean isAllocationPool(@Nullable String name) {
48-
return name != null && (name.endsWith("Eden Space") || "Shenandoah".equals(name) //
48+
return name != null && (name.endsWith("Eden Space") //
49+
|| "Shenandoah".equals(name) // non-generational Shenandoah
50+
|| "Shenandoah Young Gen".equals(name) // generational Shenandoah
4951
|| "ZHeap".equals(name) // ZGC non-generational
5052
|| "ZGC Young Generation".equals(name) // generational ZGC
5153
|| name.endsWith("New Gen") // Zing GPGC
@@ -55,7 +57,9 @@ static boolean isAllocationPool(@Nullable String name) {
5557
}
5658

5759
static boolean isLongLivedPool(@Nullable String name) {
58-
return name != null && (name.endsWith("Old Gen") || name.endsWith("Tenured Gen") || "Shenandoah".equals(name)
60+
return name != null && (name.endsWith("Old Gen") || name.endsWith("Tenured Gen") //
61+
|| "Shenandoah".equals(name) // non-generational Shenandoah
62+
|| "Shenandoah Old Generation".equals(name) // generational Shenandoah
5963
|| "ZHeap".equals(name) // ZGC non-generational
6064
|| "ZGC Old Generation".equals(name) // generational ZGC
6165
|| name.endsWith("balanced-old") //

0 commit comments

Comments
 (0)