前面我们已经讲了 JVM 性能监控工具之命令行篇,本篇我们来介绍一些可视化的性能监控工具,包括 JConsole、VisualVM、Java Mission Control 等,阿里的 Arthas 我们留到后面单独去讲。
可视化工具比命令行工具强大的地方就在于这些工具提供了更直观、更易于理解的性能数据视图,肉眼看上去,脑子就能快速 get 到问题所在,那这篇就来带大家看看这些工具的强大之处。
JConsole
JConsole(Java Monitoring and Management Console),是一款基于 JMX(Java Manage-ment Extensions)的可视化监视管理工具。
JMX 的全称是 Java Management Extensions,翻译过来就是 Java 管理扩展,既是 Java 管理系统中的一个标准,一个规范,也是一个接口,一个框架。JConsole 就相当于是 JMX 的一个实现类。
JConsole 可以用来监视 Java 应用程序的运行状态,包括内存使用、线程状态、类加载、GC 等,还可以进行一些基本的性能分析。
JConsole 连接 Java 程序
JConsole 程序位于%JAVA_HOME%bin 目录下,不过我当前的操作系统是 macOS,和 Windows 有一些不一样,我就不再刻意截 Windows 的图了,希望大家可以理解。
直接启动 JConsole,会弹出一个窗口,显示本机正在运行的 Java 程序,选择一个程序(比如说技术派的 28966),点击连接
即可。
还可以进行远程链接,比如说对服务器上的 Java 程序进行监控,需要远程服务器上的 Java 程序在启动的时候加上以下这些参数:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<PORT>
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
<PORT>
是您想要 JMX 代理监听的端口号,例如 9999。- authenticate=false 表示不需要身份验证来连接到 JMX(注意:这在生产环境中可能不安全)。
- ssl=false 表示不需要使用 SSL 加密连接(同样,这在生产环境中可能不安全)。
Java 程序概况
使用 JConsole 连接了一个本地程序,在概述
可以看到 Java 程序的运行时概况,包括堆内存使用量
、线程
、类
、CPU占用率
四项信息的曲线图。
内存监控
内存
的作用相当于可视化的 jstat 命令(上一节讲过了),用于监视 Java 堆的使用情况,可以更细化到 eden 区、suvivior 区、老年代的使用情况。
为了更加清晰地查看内存变化,可以运行下面这段,然后连接:
/**
* VM参数: -Xms100m -Xmx100m -XX:+UseSerialGC
*/
class JConcoleRAMMonitor {
/***
* 内存占位符对象,一个OOMObject大约占64KB
*/
static class OOMObject {
public byte[] placeholder = new byte[64 * 1024];
}
public static void fillHeap(int num) throws InterruptedException {
List<OOMObject> list = new ArrayList<OOMObject>();
for (int i = 0; i < num; i++) {
// 稍作延时,令监视曲线的变化更加明显
Thread.sleep(300);
list.add(new OOMObject());
}
System.gc();
}
public static void main(String[] args) throws Exception {
fillHeap(2000);
}
}
这段代码的作用是以 64KB/50ms 的速度向 Java 堆中填充数据,一共填充 1000 次。
观察 Eden 区的运行趋势,发现呈折线趋势增长。
点击「执行 GC」之后,会发现老年代的柱状图会达到峰值状态,是因为执行 GC 之后,Eden 区的对象被回收,存活的对象被移动到老年代。
线程监控
JConcole 还可以监控线程,相当于可视化的 jstack 命令(上一节讲过了)。
真诚点赞 诚不我欺
回复