一、查询 Code
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.List;
public class GCTypeDetector {
public static void main(String[] args) {
List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
System.out.println("JVM中的垃圾回收器信息:");
System.out.println("====================");
for (GarbageCollectorMXBean gcBean : gcBeans) {
System.out.println("名称: " + gcBean.getName());
System.out.println("回收次数: " + gcBean.getCollectionCount());
System.out.println("回收总时间: " + gcBean.getCollectionTime() + " ms");
System.out.println("管理的内存池: " + Arrays.toString(gcBean.getMemoryPoolNames()));
System.out.println("--------------------");
}
String gcType = identifyGCType(gcBeans);
System.out.println("\n当前JVM使用的垃圾回收器类型: " + gcType);
List<String> jvmArgs = ManagementFactory.getRuntimeMXBean().getInputArguments();
System.out.println("\nJVM启动参数:");
if (jvmArgs.isEmpty()) {
System.out.println("未设置额外的JVM参数");
} else {
for (String arg : jvmArgs) {
System.out.println(arg);
}
}
}
private static String identifyGCType(List<GarbageCollectorMXBean> gcBeans) {
String[] gcNames = new String[gcBeans.size()];
for (int i = 0; i < gcBeans.size(); i++) {
gcNames[i] = gcBeans.get(i).getName();
}
if (containsGC(gcNames, "Copy", "MarkSweepCompact")) {
return "Serial GC (-XX:+UseSerialGC)";
} else if (containsGC(gcNames, "PS Scavenge", "PS MarkSweep")) {
return "Parallel GC (-XX:+UseParallelGC)";
} else if (containsGC(gcNames, "ParNew", "ConcurrentMarkSweep")) {
return "CMS GC (-XX:+UseConcMarkSweepGC)";
} else if (containsGC(gcNames, "G1 Young Generation", "G1 Old Generation") || containsGC(gcNames, "G1 Young", "G1 Old")) {
return "G1 GC (-XX:+UseG1GC)";
} else {
return "未识别的GC类型: " + Arrays.toString(gcNames);
}
}
private static boolean containsGC(String[] gcNames, String... targets) {
for (String target : targets) {
boolean found = false;
for (String name : gcNames) {
if (name.contains(target)) {
found = true;
break;
}
}
if (!found) {
return false;
}
}
return true;
}
}
二、效果图
JVM中的垃圾回收器信息:
====================
名称: PS Scavenge
回收次数: 0
回收总时间: 0 ms
管理的内存池: [PS Eden Space, PS Survivor Space]
--------------------
名称: PS MarkSweep
回收次数: 0
回收总时间: 0 ms
管理的内存池: [PS Eden Space, PS Survivor Space, PS Old Gen]
--------------------
当前JVM使用的垃圾回收器类型: Parallel GC (-XX:+UseParallelGC)
JVM启动参数:
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:58983,suspend=y,server=n
-javaagent:/Users/admin/Library/Caches/JetBrains/IntelliJIdea2023.3/captureAgent/debugger-agent.jar
-Dfile.encoding=UTF-8