Java 监控基础 - 使用 JMX 监控和管理 Java 程序

资源代理 MBean Server 是 MBean 资源的代理,通过 MBean Server 可以让 MBean 资源用于远程管理, MBean 资源和 MBean Server 往往都是在同一个 JVM 中,但这不是必须的。

想要 MBean Server 可以管理 MBean 资源,首先要把资源注册到 MBean Server,任何符合 JMX 的 MBean 资源都可以进行注册,最后 MBean Server 会暴露一个远程通信接口对外提供服务。

3.3. JMX 远程管理

可以通过网络协议访问 JMX API,如 HTTP 协议、SNMP(网络管理协议)协议、RMI 远程调用协议等,JMX 技术默认实现了 RMI 远程调用协议。

受益于资源管理 MBean 的充分解耦,可以轻松的把资源管理功能扩展到其他协议,如通过 HTTP 在网页端进行管理。

4. JMX 的具体使用


在资源管理 MBean 部分已经演示了使用 JMX 获取 JVM 运行信息,那么如果想要自定义一个资源 MBean 呢?

下面通过一个例子,模拟一个内存资源 MBean,最后对它进行远程管理。

4.1. 编写资源管理 MBean

MBean 的编写必须遵守 JMX 的设计规范,MBean 很像一个特殊的 Java Bean,它需要一个接口和一个实现类。MBean 资源接口总是以 MBean 或者 MXBean 结尾实现类则要以接口去掉 MBean 或 MXBean 之后的名字来命名

编写一个内存资源管理 MBean 接口,定义如下:

package com.wdbyte.jmx;

/**

  • @author https://www.wdbyte.com

*/

public interface MyMemoryMBean {

long getTotal();

void setTotal(long total);

long getUsed();

void setUsed(long used);

String doMemoryInfo();

}

然后实现这个接口:

package com.wdbyte.jmx;

/**

  • @author https://www.wdbyte.com

*/

public class MyMemory implements MyMemoryMBean {

private long total;

private long used;

@Override

public long getTotal() {

return total;

}

@Override

public void setTotal(long total) {

this.total = total;

}

@Override

public long getUsed() {

return used;

}

@Override

public void setUsed(long used) {

this.used = used;

}

@Override

public String doMemoryInfo() {

return String.format(“使用内存: %dMB/%dMB”, used, total);

}

}

这个例子在 MyMemory.java 中只有两个 long 基本类型属性,所以接口是以 MBean 结尾。如果资源实现类中的属性是自定义实体类的引用,那么接口就需要以 MXBean 结尾。

这样就完成了线程数量资源 MBean 的创建,其中 totalused 是资源属性,doMemoryInfo 是资源操作方法。

4.2. 注册资源到 MBean Server

通过上面的 JMX 架构图,我们知道 MBean 资源需要注册到 MBean Server 进行代理才可以暴露给外部进行调用,所以我们想要通过远程管理我们自定义的 MyMemory 资源,需要先进行资源代理。

package com.wdbyte.jmx;

import java.lang.management.ManagementFactory;

import javax.management.InstanceAlreadyExistsException;

import javax.management.MBeanRegistrationException;

import javax.management.MBeanServer;

import javax.management.MalformedObjectNameException;

import javax.management.NotCompliantMBeanException;

import javax.management.ObjectName;

/**

  • @author https://www.wdbyte.com

*/

public class MyMemoryManagement {

public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException,

InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {

// 获取 MBean Server

MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();

MyMemory myMemory = new MyMemory();

myMemory.setTotal(100L);

myMemory.setUsed(20L);

// 注册

ObjectName objectName = new ObjectName(“com.wdbyte.jmx:type=myMemory”);

platformMBeanServer.registerMBean(myMemory, objectName);

while (true) {

// 防止进行退出

Thread.sleep(3000);

System.out.println(myMemory.doMemoryInfo());

}

}

}

启动后可以看到控制台每隔三秒打印我们自定义的内存信息。

使用内存: 20MB/100MB

使用内存: 20MB/100MB

不加任何 JVM 参数启动 Java 程序,JMX 只能在当前机器访问,如果想要通过网络在真正的远程访问,那么在启动时需要指定当前机器 ip 和开放的端口。

$ java -Dcom.sun.management.jmxremote=true \ # 开启远程访问

-Dcom.sun.management.jmxremote.port=8398 \ # 自定义 JMX 端口

-Dcom.sun.management.jmxremote.ssl=false \ # 是否使用 SSL 协议,生产环境一定要开启

-Dcom.sun.management.jmxremote.authenticate=false \ # 是否需要认证,生产环境一定要开启

-Djava.rmi.server.hostname=150.158.2.56 YourClass.java # 当前机器 ip

4.3. 远程管理 jconsole

jconsole 是 Java 自带的基于 JMX 技术的监控管理工具,如果已经配置了 JDK 环境变量,可以直接控制台通过 jconsole 命令启动。

启动 jconsole 后会列出当前机器上的 Java 进行,这里选择自己要监控的 Java 进程进行监控,连接后会提示不安全的协议,是因为 Java 程序默认启动是不会配置 HTTPS 协议的原因。

连接后可以看到多维度的 JVM 监控信息,这些信息都是通过读取 JVM 资源 MBean 信息得到的。

在下面这个页面列举了线程信息,注意最下面的线程信息,可以看到 RMI TCP 线程,这里也证明了 JMX 默认通过 RMI 协议进行远程管理。

在 MBean 页面可以浏览所有可管理的 MBean 信息,也可以看到我们自定义的 com.wdbyte.jmx 中的内存信息,甚至可以直接修改其中的 used 变量。

修改后控制台日志立即发生变化,可以看到已经修改成功。

使用内存: 20MB/100MB

使用内存: 20MB/100MB

使用内存: 20MB/100MB

使用内存: 30MB/100MB

面试资料整理汇总

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

功。

使用内存: 20MB/100MB

使用内存: 20MB/100MB

使用内存: 20MB/100MB

使用内存: 30MB/100MB

面试资料整理汇总

[外链图片转存中…(img-V1GC8Ieq-1714316690412)]

[外链图片转存中…(img-XHvUrNHW-1714316690413)]

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值