Skip to content

Commit 1b107fd

Browse files
Add GarbageCollectorInfo to ProcessInfo
1 parent 19c3860 commit 1b107fd

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/info/ProcessInfo.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616

1717
package org.springframework.boot.info;
1818

19+
import java.lang.management.GarbageCollectorMXBean;
1920
import java.lang.management.ManagementFactory;
2021
import java.lang.management.MemoryMXBean;
2122
import java.lang.management.MemoryUsage;
2223
import java.lang.management.PlatformManagedObject;
2324
import java.lang.reflect.Method;
25+
import java.util.List;
2426

2527
import org.springframework.util.ClassUtils;
2628

@@ -40,6 +42,9 @@ public class ProcessInfo {
4042

4143
private static final Runtime runtime = Runtime.getRuntime();
4244

45+
private static final List<GarbageCollectorMXBean> garbageCollectorMXBeans = ManagementFactory
46+
.getGarbageCollectorMXBeans();
47+
4348
private final long pid;
4449

4550
private final long parentPid;
@@ -117,6 +122,19 @@ private <T> T invokeMethod(Class<?> mxbeanClass, Object mxbean, String name) thr
117122
return (T) method.invoke(mxbean);
118123
}
119124

125+
/**
126+
* Garbage Collector information for the process. This list provides details about the
127+
* currently used GC algorithms selected by the user or JVM ergonomics. It might not
128+
* be trivial to know the used GC algorithms since that usually depends on the
129+
* {@link Runtime#availableProcessors()} (see: {@link ProcessInfo#getCpus()}) and the
130+
* available memory (see: {@link ProcessInfo#getMemory()}).
131+
* @return {@link List} of {@link GarbageCollectorInfo}.
132+
* @since 3.5.0
133+
*/
134+
public List<GarbageCollectorInfo> getGarbageCollectors() {
135+
return garbageCollectorMXBeans.stream().map(GarbageCollectorInfo::new).toList();
136+
}
137+
120138
public long getPid() {
121139
return this.pid;
122140
}
@@ -223,4 +241,30 @@ public long getMax() {
223241

224242
}
225243

244+
/**
245+
* Garbage Collector information.
246+
*
247+
* @since 3.5.0
248+
*/
249+
public static class GarbageCollectorInfo {
250+
251+
private final String name;
252+
253+
private final long collectionCount;
254+
255+
GarbageCollectorInfo(GarbageCollectorMXBean garbageCollectorMXBean) {
256+
this.name = garbageCollectorMXBean.getName();
257+
this.collectionCount = garbageCollectorMXBean.getCollectionCount();
258+
}
259+
260+
public String getName() {
261+
return this.name;
262+
}
263+
264+
public long getCollectionCount() {
265+
return this.collectionCount;
266+
}
267+
268+
}
269+
226270
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/info/ProcessInfoTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616

1717
package org.springframework.boot.info;
1818

19+
import java.util.List;
20+
1921
import org.junit.jupiter.api.Test;
2022
import org.junit.jupiter.api.condition.EnabledForJreRange;
2123
import org.junit.jupiter.api.condition.JRE;
2224

25+
import org.springframework.boot.info.ProcessInfo.GarbageCollectorInfo;
2326
import org.springframework.boot.info.ProcessInfo.MemoryInfo.MemoryUsageInfo;
2427
import org.springframework.boot.info.ProcessInfo.VirtualThreadsInfo;
2528

@@ -77,4 +80,15 @@ void virtualThreadsInfoIfNotAvailable() {
7780
assertThat(processInfo.getVirtualThreads()).isNull();
7881
}
7982

83+
@Test
84+
void garbageCollectorsInfoIsAvailable() {
85+
ProcessInfo processInfo = new ProcessInfo();
86+
List<GarbageCollectorInfo> garbageCollectorsInfo = processInfo.getGarbageCollectors();
87+
assertThat(garbageCollectorsInfo).isNotEmpty();
88+
assertThat(garbageCollectorsInfo).allSatisfy((garbageCollectorInfo) -> {
89+
assertThat(garbageCollectorInfo.getName()).isNotEmpty();
90+
assertThat(garbageCollectorInfo.getCollectionCount()).isNotNegative();
91+
});
92+
}
93+
8094
}

0 commit comments

Comments
 (0)