当前位置: 首页 > news >正文

【Java】查看当前 Java 使用的垃圾回收器

一、查询 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("--------------------");
        }

        // 根据GC名称识别GC类型
        String gcType = identifyGCType(gcBeans);
        System.out.println("\n当前JVM使用的垃圾回收器类型: " + gcType);

        // 打印JVM参数
        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) {
        // 提取所有GC收集器的名称
        String[] gcNames = new String[gcBeans.size()];
        for (int i = 0; i < gcBeans.size(); i++) {
            gcNames[i] = gcBeans.get(i).getName();
        }

        // 按照特征识别GC类型
        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

相关文章:

  • 【GitHub探索】mcp-go,MCP协议的Golang-SDK
  • AVL搜索树
  • 互斥锁(mutex) ---- 静态锁与动态锁
  • (C语言)算法复习总结1——二分查找
  • 【T2I】Region-Aware Text-to-Image Generation via Hard Binding and Soft Refinement
  • GPT-2 语言模型 - 模型训练
  • 关于柔性数组
  • 开源项目faster-whisper和whisper是啥关系
  • C语言之continue相关题目
  • 剖析 Rust 与 C++:性能、安全及实践对比
  • 【频域分析】对数谱
  • app逆向专题四:charles抓包工具配置
  • Relief法**是一种非常经典、有效的**特征选择算法
  • Java—— 文字版格斗游戏
  • 整型与布尔型的转换
  • 二分三分算法详解, 模板与临界条件分析
  • Android开发:应用DeepSeek官方Api在App中实现对话功能
  • 智能制造方案精读:117页MES制造执行系统解决方案【附全文阅读】
  • vue webSocket
  • 腾势品牌欧洲市场冲锋,科技豪华席卷米兰
  • 因操纵乙烯价格再遭诉讼,科莱恩等四家企业被陶氏索赔60亿
  • 王毅集体会见加勒比建交国外长及代表
  • 摩根士丹利:对冲基金已加码,八成投资者有意近期增配中国
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,市场有望迎来新增量需求
  • 为证明我爸是我爸,我将奶奶告上法庭
  • IPO周报|本周A股暂无新股网上申购,年内最低价股周二上市