Java 性能监控工具详解:JConsole、VisualVM 和 Java Mission Control
在 Java 应用程序的开发和维护过程中,性能监控和故障诊断是至关重要的。本文将详细介绍三款常用的 Java 性能监控工具:JConsole、VisualVM 和 Java Mission Control(JMC),并探讨它们的功能和使用方法。
1 JConsole
1.1 简介
JConsole(Java Monitoring and Management Console)是一款基于 JMX(Java Management Extensions)的可视化监控管理工具。JMX 是 Java 管理系统中的一个标准,JConsole 则是 JMX 的一个实现类。JConsole 可以用于监控 Java 应用程序的运行状态,包括内存使用、线程状态、类加载、垃圾回收(GC)等,还可以进行一些基本的性能分析。
1.2 连接 Java 程序
JConsole 位于 %JAVA_HOME%/bin 目录下。启动 JConsole 后,会显示本机正在运行的 Java 程序,用户可以选择一个程序进行连接。此外,JConsole 还支持远程连接,监控服务器上的 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 代理监听的端口号,authenticate=false 表示不需要身份验证,ssl=false 表示不使用 SSL 加密连接。
1.3 功能概述
使用 JConsole 连接本地 Java 程序后,可以在 概述 面板中查看程序的运行时概况。主要包括以下四项信息的曲线图:
- 堆内存使用量:显示 Java 堆内存的使用情况。
- 线程:显示当前活动的线程数量。
- 类:显示已加载的类数量。
- CPU 占用率:显示程序的 CPU 使用率。
这些曲线图可以帮助开发者快速了解程序的整体运行状态。

1.3.1 内存监控
JConsole 的内存监控功能相当于可视化的 jstat 命令,能够实时监控 Java 堆内存的使用情况。具体可以细化为以下几个区域:
- Eden 区:新创建的对象首先分配在 Eden 区。
- Survivor 区:存活的对象从 Eden 区移动到 Survivor 区。
- 老年代:长时间存活的对象最终会被移动到老年代。
示例代码:观察内存变化
以下代码用于模拟内存分配,并通过 JConsole 观察内存变化:
/*** 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); // 填充 2000 个对象}
}
运行结果分析
-
Eden 区趋势:运行代码后,Eden 区的内存使用量呈折线趋势增长。

-
执行 GC 后:点击 JConsole 中的「执行 GC」按钮后,Eden 区的对象被回收,存活的对象被移动到老年代,此时老年代的柱状图会达到峰值。

1.3.2 线程监控
JConsole 的线程监控功能相当于可视化的 jstack 命令,能够显示应用程序内的线程状态。具体功能包括:
- 线程数量:显示当前活动的线程数量。
- 线程详情:左下方列出程序中所有的线程,点击线程名称可以查看线程的栈信息。
- 死锁检测:JConsole 可以快速定位死锁问题。
示例代码:死锁检测
以下代码模拟了一个典型的死锁场景:
class DeadLockDemo {private static final Object lock1 = new Object();private static final Object lock2 = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (lock1) {System.out.println("线程1获取到了锁1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2) {System.out.println("线程1获取到了锁2");}}}).start();new Thread(() -> {synchronized (lock2) {System.out.println("线程2获取到了锁2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock1) {System.out.println("线程2获取到了锁1");}}}).start();}
}
运行结果分析
- 运行代码后,点击 JConsole 线程面板中的「检测到死锁」按钮,可以查看线程的死锁信息。

1.3.3 类加载情况
在 JConsole 的 类 面板中,可以查看以下信息:
- 已加载的类数量:显示当前已加载的类数量。
- 已卸载的类数量:显示已卸载的类数量。
这些信息可以帮助开发者了解应用程序的类加载行为。

1.3.4 VM 概要
在 JConsole 的 VM 概要 面板中,可以查看当前应用程序的运行时环境信息,包括:
- 虚拟机类型:如 HotSpot。
- 虚拟机版本:如 JDK 版本号。
- 堆信息:如堆内存的初始大小和最大大小。
- 虚拟机参数:如启动时设置的 JVM 参数。

2. VisualVM
VisualVM(All-in-One Java Troubleshooting Tool)是一款集性能监控、故障诊断和分析于一体的工具。它不仅能够监控 Java 应用程序的运行状态,还支持生成堆转储快照、分析 CPU 和内存使用情况等功能。
2.1 安装与启动
2.1.1 下载与安装
VisualVM 的安装非常简单,访问其官方网站 https://visualvm.github.io 下载适合您操作系统的版本。安装完成后,启动 VisualVM,界面如下所示:

2.1.2 插件功能
VisualVM 支持插件扩展,用户可以通过以下步骤安装插件:
- 点击菜单栏中的
Tools -> Plugins。 - 在可用插件列表中选择需要的插件,点击安装。
插件功能极大地扩展了 VisualVM 的能力,例如支持更多的监控指标、分析工具等。

2.2 生成与浏览堆转储快照
堆转储快照(Heap Dump)是分析内存问题的重要工具。VisualVM 提供了两种生成堆转储快照的方式:
2.2.1 方式一:右键生成
- 在应用程序面板中,右键点击目标应用程序。
- 选择
Heap Dump,VisualVM 会自动生成堆转储快照。

2.2.2 方式二:监视面板生成
- 在应用程序面板中选择目标应用程序。
- 在“监视”面板中,点击
Heap Dump按钮。

2.2.3 保存堆转储快照
生成的堆转储快照默认是临时文件,关闭 VisualVM 后会被自动清理。如果需要保存快照文件,可以:
- 在
heapdump节点上右键点击。 - 选择
另存为,将堆转储快照保存到本地。

2.3 分析程序性能
VisualVM 提供了强大的性能分析功能,可以帮助开发者深入了解应用程序的 CPU 和内存使用情况。
2.3.1 CPU 分析
- 在
分析 profiler面板中,点击CPU按钮。 - VisualVM 会开始记录应用程序执行的所有方法。
- 返回应用程序进行操作,操作结束后点击
停止按钮。 - 分析结果会显示每个方法的执行次数和执行耗时。
2.3.2 内存分析
- 在
分析 profiler面板中,点击Memory按钮。 - VisualVM 会开始记录应用程序的内存分配情况。
- 返回应用程序进行操作,操作结束后点击
停止按钮。 - 分析结果会显示每个方法的内存分配情况。

3. Java Mission Control (JMC)
JMC 是一款集性能监控、故障诊断和分析于一体的工具,适用于 Java 应用程序的开发和生产环境。它提供了丰富的功能,包括 MBean 服务器监控、飞行记录器(JFR)等,能够帮助开发者深入分析应用程序的性能问题。
- GitHub 地址:https://github.com/openjdk/jmc
- 官方下载:https://jdk.java.net/jmc/8/
3.1 安装与启动
- 访问 https://jdk.java.net/jmc/8/ 下载 JMC。
- 解压下载的文件,启动 JMC。
启动后的界面如下所示:

3.2 MBean 服务器
MBean(Managed Bean)是 Java 管理扩展(JMX)的一部分,用于管理 Java 应用程序。通过 JMC 的 MBean 服务器功能,可以监控以下信息:
- Java 堆使用率:显示堆内存的使用情况。
- CPU 使用率:显示应用程序的 CPU 占用情况。
- Live Set + Fragmentation:Live Set 表示存活对象的大小,Fragmentation 表示内存碎片的大小。

3.3 飞行记录器(Flight Recorder, JFR)
飞行记录器(JFR)是 JMC 提供的一项强大功能,能够记录应用程序在一段时间内的运行情况,并进行分析和展示。JFR 提供的数据质量通常比其他工具通过代理形式采样获得的更高。
3.3.1 启用 JFR
要使用 JFR,需要在启动 Java 程序时添加以下参数:
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
3.3.2 使用 JFR 进行性能记录
- 连接已启用 JFR 的 Java 程序。
- 启动飞行记录器,设置记录时间(例如 1 分钟)。
- 记录结束后,JMC 会自动打开记录文件。


3.3.3 JFR 的优势
- 垃圾回收分析:JFR 不仅提供各分代的大小、收集次数和时间等“结果”类信息,还能显示内存中分配和回收的对象,提供“过程”类信息。
- CPU 和内存分析:JFR 可以记录应用程序的 CPU 使用情况和内存分配情况,帮助开发者定位性能瓶颈。
3.4. 示例代码与分析
3.4.1 CPU 使用过高示例
以下代码模拟了一个 CPU 使用率过高的场景:
/*** 消耗 CPU 的线程* 不断循环进行浮点运算*/
private static void cpuHigh() {Thread thread = new Thread(() -> {Thread.currentThread().setName("cpu_high_thread");while (true) {double pi = 0;for (int i = 0; i < Integer.MAX_VALUE; i++) {pi += Math.pow(-1, i) / (2 * i + 1);}System.out.println("Pi: " + pi * 4);}});thread.start();
}

3.4.2 内存使用过高示例
以下代码模拟了一个内存使用率过高的场景:
/*** 不断新增 BigDecimal 信息到 list*/
private static void allocate() {new Thread(() -> {Thread.currentThread().setName("memory_allocate_thread");List<BigDecimal> list = new ArrayList<>();for (int i = 0; i < Integer.MAX_VALUE; i++) {try {Thread.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}list.add(new BigDecimal(i));}}).start();
}

3.4.3 分析结果
- 内存面板:通过 JMC 的内存面板,可以看到
String对象占用了最多的内存。 - 线程页面:切换到线程页面,勾选相关复选框,可以查看内存分配情况和 CPU 使用情况。
- 死锁检测:JMC 还可以检测并显示死锁信息。
4. 第三方工具
除了上述官方工具外,还有一些第三方工具也非常有用:
- MAT(Memory Analyzer Tool):Java 堆内存分析工具。
- GChisto:GC 日志分析工具。
- GCViewer:GC 日志分析工具。
- JProfiler:商用的性能分析利器。
- Arthas:阿里开源诊断工具。
- async-profiler:Java 应用性能分析工具,支持火焰图和跨平台。
5. 总结
本文介绍了三款常用的 Java 性能监控工具:JConsole、VisualVM 和 Java Mission Control。它们各自具有独特的功能和优势,能够帮助开发者更好地监控和诊断 Java 应用程序的性能问题。在实际开发中,可以根据具体需求选择合适的工具,并结合第三方工具进行更深入的分析和优化。
通过合理使用这些工具,开发者可以更高效地定位和解决性能瓶颈,确保 Java 应用程序的稳定运行。
6 思维导图

7 参考链接
JVM 性能监控工具之可视化篇
相关文章:
Java 性能监控工具详解:JConsole、VisualVM 和 Java Mission Control
在 Java 应用程序的开发和维护过程中,性能监控和故障诊断是至关重要的。本文将详细介绍三款常用的 Java 性能监控工具:JConsole、VisualVM 和 Java Mission Control(JMC),并探讨它们的功能和使用方法。 1 JConsole 1…...
浏览器报错:您的连接不是私密连接,Kubernetes Dashboard无法打开
问题描述 部署完成Kubernetes Dashboard后,打开HTTPS的web页面,Chrome和Edge浏览器都无法正常加载页面,会提示您的连接不是私密连接的报错。 原因: 浏览器不信任这些自签名的ssl证书,为了…...
用Python进行大数据处理:如何使用pandas和dask处理海量数据
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着数据量的爆炸式增长,大数据处理成为现代数据科学和工程领域的核心挑战。Python作为数据分析的重要工具,其生态系统中的pandas和dask库…...
机器人手眼标定
机器人手眼标定 一、机器人手眼标定1. 眼在手上标定基本原理2. 眼在手外标定基本原理 二、眼在手外标定实验三、标定精度分析 一、机器人手眼标定 要实现由图像目标点到实际物体上抓取点之间的坐标转换,就必须拥有准确的相机内外参信息。其中内参是相机内部的基本参…...
基于Springboot + vue实现的校园失物招领系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
关于C语言初步的一些基础知识整理(2)
“本篇是对于C语言初步中一些基础知识的简单整理,内容较为琐碎,但实用” 在C语言中,格式控制符是用于指定数据输出格式的特殊字符,不同的数据类型有着其对应的格式控制符。具体的: %f 用于输出浮点型数据(…...
Linux驱动开发:深入理解I2C时序(二)
在Linux驱动开发中,I2C时序的理解和正确处理是保证I2C设备正常工作和通信的关键。I2C协议的时序特性决定了数据的有效传输和设备间的协作。因此,掌握I2C的时序细节,以及如何在Linux内核中进行时序处理,能够让开发者更好地处理设备通信问题。 本文将继续深入探讨I2C通信协议…...
逆向安卓抓包
打开Mumu网易,打开设置,打开其他,开启root权限 打开Mumu网易,找到apk安装藏航准备网.apk charles配置:proxy setting 端口9888 查看当地IP:help--->local IP address SSL Proxying Setting--->Add---->IP…...
Spring源码分析之事件机制——观察者模式(一)
目录 事件基类定义 事件监听器接口 事件发布者接口及实现 事件广播器实现 小小总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二)-CSDN博客 Spring源码分析之事件机制…...
QT实现 端口扫描暂停和继续功能 3
上篇QT给端口扫描工程增加线程2-CSDN博客 为按钮pushButton_Stop添加clicked事件,功能为暂停扫描,并在暂停后显示继续按钮,点击继续按钮之后继续扫描 1.更新UI 添加继续按钮 点击转到槽则会自动声明 2. 更新 MainWindow.h 需要新增的部分…...
SHViT模型详解
模型简介 SHViT是一种创新的 单头视觉Transformer ,旨在优化计算效率和内存使用。它的核心设计理念围绕着消除传统视觉Transformer架构中的冗余元素,特别关注宏观和微观设计层面的问题。 SHViT采用了 1616的大跨度patchify stem 和 3阶段结构 ,这种独特的设计不仅有效减少…...
QGIS Server安装部署教程
一、QGIS 安装部署 1、下载安装QGIS链接如下图,选择最新的安装包文件QGIS-OSGeo4W-3.34.14-1.msi,下载完成后运行安装。 2、安装时选择QGIS安装路径不要带空格,此处会影响QGIS Server安装运行。 3、安装过程省略,安装完成后打…...
基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化
基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈: import org.apache.commons.pool2.impl.GenericO…...
【C语言】
目录 第一个C语言程序题目实际应用程序要求输入描述输出描述示例 程序实现三级目录 第一个C语言程序 打开VS创建项目(视图-解决方案管理器)创建源文件(后缀.c).c会按照C的语言编译代码 c #include <stdio.h> //std-标准 //…...
标题:利用Spring Boot构建JWT刷新令牌应用
标题:利用Spring Boot构建JWT刷新令牌应用 去发现同类优质开源项目:https://gitcode.com/ 一、项目介绍 在Java开发中,Spring Boot以其简洁的配置和强大的功能深受开发者喜爱。Spring Boot Refresh Token with JWT 是一个开源示例项目,它展…...
性能测试工具的原理与架构解析
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 在软件开发与运维领域,性能测试是确保系统稳定、高效运行的关键环节。性能测试工具作为实现这一目标的重要工具,通过模拟真实用户行为和负载…...
基于STM32的自动水满报警系统设计
目录 引言系统设计 硬件设计软件设计系统功能模块 水位检测模块报警模块自动控制模块控制算法 水位检测逻辑报警触发逻辑代码实现 水位检测模块报警控制模块自动控制逻辑系统调试与优化结论与展望 1. 引言 水满报警系统在家庭、农业、工业等领域广泛应用,通过实时…...
C语言 数组编程练习
1.将数组A的内容和数组B中的内容进行交换。(数组一样大) 2.创建一个整形数组,完成对数组的操作 实现函数Init()初始化数组全为0 实现print()打印数组的每个元素 实现reverse()函数完成数组元素的逆置 //2.创建一个整形数组,完…...
Windows 远程桌面连接Ubuntu操作 可以自由相互复制文件 粘贴板等
1.windows不用动,用IP和用户密码直接连 Ubuntu设置 详细参考:https://blog.csdn.net/qq_22370409/article/details/88914093 新建的用户需要加入sudo 使有权限。 效果 可以自由相互复制文件 粘贴板等。...
链表OJ题(一)
(一)轮转数组 . - 力扣(LeetCode) 题目描述:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例一: 方法一:暴力求解 先用一个变量存储数组中的最后…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果