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 是非负数。 示例一: 方法一:暴力求解 先用一个变量存储数组中的最后…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
