Java 垃圾回收 中 怎么使用JMX监控GC

大雪姑娘_8987

大雪姑娘_8987

2026-11-10

533人浏览

原创

使用jmx监控java垃圾回收,核心是获取 mbeanserverconnection 并查询 java.lang:type=garbagecollector,name=* 和 java.lang:type=memorypool,name=* 的mbean。通过轮询这些mbean的属性(如 collectioncount、collectiontime、usage),可以实时获取gc次数、耗时及内存池使用情况。若需远程监控,需确保目标jvm启动时开启了jmx端口并配置了认证,本地监控则可直接通过 mbeanserverlocator 或 managementfactory 获取连接。

Java 垃圾回收 中 怎么使用JMX监控GC

如何获取本地JVM的GC MBean连接

在本地进程中,直接通过 ManagementFactory.getPlatformMBeanServer() 即可获取 MBeanServer 实例,无需网络通信。接着使用 MBeanServerConnection.queryNames() 配合 ObjectName 模式匹配,筛选出所有垃圾回收器MBean。这种方式延迟最低,适合进程内监控工具或Agent的实现。

Java 垃圾回收 中 怎么使用JMX监控GC

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.Set;

public class LocalGCMonitor {
    public static void main(String[] args) throws Exception {
        // 1. 获取本地MBean服务器
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        
        // 2. 定义GC MBean的名称模式
        ObjectName gcPattern = new ObjectName("java.lang:type=GarbageCollector,name=*");
        
        // 3. 查询所有GC MBean
        Set<objectname> gcNames = mbs.queryNames(gcPattern, null);
        
        for (ObjectName name : gcNames) {
            // 4. 读取关键属性:收集次数和总耗时
            Long collectionCount = (Long) mbs.getAttribute(name, "CollectionCount");
            Long collectionTime = (Long) mbs.getAttribute(name, "CollectionTime");
            String gcName = name.getKeyProperty("name");
            
            System.out.println("GC: " + gcName + ", Count: " + collectionCount + ", Time(ms): " + collectionTime);
        }
    }
}</objectname>

运行上述代码,输出将显示当前JVM中每个垃圾回收器的名称、累计收集次数以及累计消耗的毫秒数。例如,如果使用G1 GC,可能会看到 G1 Young Generation 和 G1 Old Generation 两个MBean。这些数据是累积值,需要自行计算差值以获得瞬时速率。

如何远程监控JVM的内存池状态

远程监控需要目标JVM在启动时添加JMX参数,如 -Dcom.sun.management.jmxremote。客户端通过 JMXConnectorFactory.connect() 建立连接后,除了查询GC MBean,还需重点监控内存池(MemoryPool)MBean。内存池MBean提供了 Usage 属性,反映堆内不同区域(如Eden、Survivor、Old Gen)的当前内存使用量、最大容量和阈值。通过对比 Usage.used 和 Usage.max,可以判断内存是否接近上限,从而辅助GC调优。

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载

Java 垃圾回收 中 怎么使用JMX监控GC

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.HashMap;
import java.util.Map;

public class RemoteMemoryMonitor {
    public static void main(String[] args) throws Exception {
        // 1. 构建远程JMX URL (替换为实际IP和端口)
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9090/jmxrmi");
        
        // 2. 建立连接 (无认证示例,生产环境需配置credentials)
        Map<string object> env = new HashMap();
        String[] creds = new String[]{"admin", "password"};
        env.put(JMXConnector.CREDENTIALS, creds);
        
        try (JMXConnector connector = JMXConnectorFactory.connect(url, env)) {
            MBeanServerConnection mbsc = connector.getMBeanServerConnection();
            
            // 3. 查询内存池MBean
            ObjectName poolPattern = new ObjectName("java.lang:type=MemoryPool,name=*");
            Set<objectname> poolNames = mbsc.queryNames(poolPattern, null);
            
            for (ObjectName name : poolNames) {
                // 4. 获取内存使用信息
                Map usageMap = (Map) mbsc.getAttribute(name, "Usage");
                long used = ((Number) usageMap.get("used")).longValue();
                long max = ((Number) usageMap.get("max")).longValue();
                String poolName = name.getKeyProperty("name");
                
                System.out.printf("Pool: %s, Used: %d MB, Max: %d MB%n",
                    poolName, used / 1024 / 1024, max / 1024 / 1024);
            }
        }
    }
}</objectname></string>

该程序连接到远程JVM后,会打印出每个内存池的已用内存和最大内存。注意,Usage 是一个 MemoryUsage 对象,在JMX中通常以Map形式返回或通过特定方法访问。在实际开发中,建议定期轮询并记录历史数据,以便绘制内存趋势图。若远程连接失败,请检查防火墙是否放行JMX端口,以及JVM启动参数是否正确配置了 jmxremote.port 和 jmxremote.authenticate。

当GC MBean的CollectionTime为0时意味着什么

当某个GC MBean的 CollectionTime 属性为0时,意味着自JVM启动以来,该垃圾回收器尚未执行过任何一次完整的垃圾收集。这通常发生在JVM刚启动不久,或者该特定的GC阶段(如G1的Young GC)还未被触发。如果预期应该发生GC但时间仍为0,可能表明堆内存充足,GC压力极小,或者监控的MBean名称与实际运行的GC器不匹配(例如在ZGC下某些旧版JDK可能没有对应的传统MBean)。此时应结合 CollectionCount 一起查看,若两者均为0,则确认未发生过GC。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

12297

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9382

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

8012

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1304

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1028

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1556

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3229

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20471

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1395

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习