JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用

news/2025/2/27 9:21:25

生产问题定位指南:几款必备的可视化工具

引言

在上一篇文章中,详细的介绍了JDK自带的一系列命令行工具,,如jps、jmap、jstat、jstack以及jcmd等,这些工具为排查和诊断Java虚拟机(JVM)问题提供了坚实的基础。这些工具虽然强大,但使用门槛相对较高,且信息的呈现方式较为原始,不易于直观理解。为了弥补这一不足,本篇将重点介绍三个可视化工具:JConsole、VisualVM和MAT(Memory Analyzer Tool)。这些工具以图形界面的形式,将复杂的Java虚拟机信息以直观、易懂的方式呈现出来,极大地降低了问题定位的难度。

工具选型全景图

问题类型
性能问题
内存问题
线程问题
VisualVM
JConsole
MAT
VisualVM

1. JConsole

简介

JConsole 是 Java 开发工具包(JDK)自带的一个监控和管理工具,主要用于监控 Java 应用程序的性能和资源消耗。它通过 JMX(Java Management Extensions)技术连接到 Java 虚拟机(JVM),并提供实时的监控数据。

使用场景

JConsole 适用于需要快速查看 JVM 状态和性能指标的场景,尤其是在开发环境和测试环境中。它的简单易用性使得开发者和运维人员可以迅速定位内存泄漏、线程死锁等问题。

核心功能矩阵

功能模块监控指标示例使用价值
内存监控各分区使用趋势、GC次数/耗时发现内存泄漏征兆
线程监控活动线程数、死锁检测诊断线程阻塞问题
MBean操作动态修改日志级别、触发GC实时干预生产环境
类加载监控已加载类数量/卸载情况检测类加载泄漏

启动JConsole

启动JConsole,选择目标Java进程进行连接。连接成功后,丰富的监控信息即刻呈现。例如,通过内存视图,您可以直观观察到内存使用的变化趋势,及时发现并解决内存泄漏的隐患。

# 启动jconsole
jconsole
# 带鉴权的远程连接
jconsole -J-Djavax.net.ssl.keyStore=/path/to/keystore \
         -J-Djavax.net.ssl.keyStorePassword=changeit \
         service:jmx:rmi:///jndi/rmi://192.168.1.100:9999/jmxrmi

启动JConsole,选择目标Java进程进行连接

核心功能

1. 概览(Overview)
  • 作用:显示Java虚拟机(VM)和监控值的概览信息。
  • 用法:在“概述”标签中,可以查看CPU使用率、内存使用率、线程数以及Java VM中加载的类的数量等关键性能指标。这些指标通常以折线图的形式展示,帮助开发者快速了解应用程序的整体性能状况。此外,对着图表点击右键可以保存数据到CSV文件,以便后续使用其他工具进行深入分析。
    在这里插入图片描述
2. 内存 (Memory)
  • 作用:显示内存使用信息,包括堆内存、非堆内存以及内存池的状况。
  • 用法:在“内存”标签中,开发者可以查看堆内存和非堆内存的使用量,以及内存池(如Eden Space、Survivor Space、Tenured Gen等)的使用情况。此外,还可以查看不同垃圾回收器(GC)进行垃圾回收的次数和时间。这些信息对于调优内存性能和诊断内存泄漏非常有用。开发者可以手动触发垃圾回收操作,并观察内存变化以评估性能。
    在这里插入图片描述
3. 线程 (Threads)
  • 作用:显示线程使用信息。
  • 用法:线程标签展示了当前 JVM 中所有活动线程的状态,包括它们的名称、状态、阻塞计数、等待计数以及堆栈跟踪信息 2。此标签还包括一个“检测死锁”按钮,可以帮助识别线程间是否存在死锁的情况。这对于调试多线程应用中的同步问题至关重要。
    在这里插入图片描述
    在这里插入图片描述
4. 类(Classes)
  • 作用:显示类装载信息。
  • 用法:在“类”标签中,可以监控 JVM 中类的加载和卸载情况。提供类加载器的相关信息,有助于排查类加载问题。
    在这里插入图片描述
5. VM 摘要(VM Summary)
  • 作用:显示Java虚拟机信息。
  • 用法:在“VM概要”标签中,可以查看有关Java虚拟机的详细信息,包括JVM版本、内存设置(如堆大小和非堆大小)、垃圾回收器类型等。这些信息对于了解JVM的配置和调优性能非常有帮助。
    在这里插入图片描述
6.MBeans
  • 作用:显示MBean信息。
  • 用法:在“MBeans”标签中,可以浏览和管理Java管理扩展(MBean)服务器中的MBean。MBean是一种Java对象,它符合特定的管理接口,使得开发者可以通过标准的方式对应用程序进行管理。通过MBeans,开发者可以监控和管理应用程序的各种资源,如数据库连接池、消息队列等。此外,还可以执行自定义的管理操作,如重启服务、更改配置参数等。
    在这里插入图片描述

2. VisualVM

简介

VisualVM 是另一个 JDK 自带(Oracle JDK 9 中已经不再捆绑,需单独下载)的工具,它集成了多个监控和诊断工具,提供了一个统一的界面来监控 Java 应用程序的性能和资源使用情况。VisualVM 支持本地和远程监控,并且可以通过插件扩展功能。同时,VisualVM 支持对 jmap 生成的堆转储文件和 jstack 生成的线程转储文件进行分析,为离线数据检测提供了有力支持。

使用场景

VisualVM,这一集多种功能于一身的Java性能监控与分析工具,不仅提供CPU使用率、内存使用率、线程活动等实时监控功能,还支持生成性能与内存快照,为您的后续分析与报告提供坚实基础。此外,VisualVM的插件扩展机制,更使其功能无限延伸,满足您的多样化需求。

核心功能矩阵

功能模块监控指标/操作示例使用价值
CPU Profiling热点方法分析、调用树、采样/精确模式定位性能瓶颈
内存分析堆/非堆内存使用、GC活动、对象直方图发现内存泄漏、优化内存分配
线程监控线程状态、死锁检测、线程Dump诊断线程阻塞、死锁问题
MBean操作动态修改配置、触发GC、查看运行时信息实时干预生产环境
快照分析性能快照、内存快照、线程快照历史问题回溯分析
插件扩展BTrace脚本、TDA分析、GC日志可视化深度定制分析能力

启动VisualVM

在 Oracle JDK 6~8 版本中会默认包含在里面,直接使用命令启动

jvisualvm   

JDK8的8u361版本及Oracle JDK9之后需要单独下载工具,具体可以参考这篇博客。
启动VisualVM,选择本地或远程Java进程进行监控。在监控界面中,CPU使用率、内存使用率等关键指标一目了然。通过内置的分析器,您可以轻松生成快照与报告,深入挖掘应用性能的秘密。例如,内存分析器将助您发现内存泄漏问题,并详细展示对象的内存使用情况及引用关系。
在这里插入图片描述

核心功能

1. 概述(Overview)

作用
概述标签提供了Java应用程序的基本信息和性能概览。它显示应用程序的启动时间、持续时间、JVM版本、类路径、系统属性等基本信息,以及CPU使用率、内存使用率等关键性能指标。
在这里插入图片描述

2. 监视(Monitor)标签

作用
监视页面用于实时查看 JVM 的关键性能指标,包括堆内存使用情况、非堆内存(如永久代或元空间)使用情况、垃圾回收活动以及加载的类的数量 。用户可以通过此页面手动触发垃圾回收,并观察其对内存的影响。当出现 OutOfMemoryError 时,还可以配置生成堆转储文件。

用法

  • 在监视标签中,你可以看到CPU使用率的实时变化,以及内存的使用情况,包括堆内存的使用量、垃圾回收次数和时间等。
  • 类部分显示已加载的类数量和卸载的类数量,帮助你了解类的加载和卸载情况。
  • 线程部分显示当前活动的线程数量,以及线程的状态(如运行、等待、阻塞等)。
  • 你可以通过监视这些数据,及时发现性能瓶颈或异常行为。
    在这里插入图片描述

3. 线程(Threads)标签

作用
线程页面展示了当前 JVM 中所有活动线程的状态,包括线程名称、状态、CPU 使用率等 。这里有一个特别有用的功能是“检测死锁”,可以帮助识别是否存在线程间的死锁问题。通过时间线视图,可以追踪线程在不同时间段内的状态变化,这对于分析多线程应用中的并发问题非常有帮助。

用法

  • 在线程标签中,你可以看到所有线程的详细信息,包括线程ID、名称、状态、优先级等。
  • 你可以通过线程ID或名称进行筛选,找到特定的线程。
  • 线程堆栈信息部分显示每个线程的堆栈调用情况,帮助你了解线程的执行路径和状态。
  • 如果发现线程死锁或性能问题,你可以通过线程Dump功能生成线程的堆栈信息,并将其保存为文件,以便后续分析。
    在这里插入图片描述
    在这里插入图片描述

4. 抽样器(Sampler)标签

作用
抽样器/剖析器页面允许用户执行 CPU 和内存采样,以了解应用程序中哪些方法消耗了最多的资源 。对于 CPU 分析,可以看到每个方法的调用次数和总执行时间;对于内存分析,则可以查看对象分配的情况及存活的对象数量。这有助于定位性能瓶颈并进行针对性的优化。

用法

  • 在抽样器标签中,你可以选择对CPU或内存进行取样分析。
  • 取样过程中,VisualVM会定期收集应用程序的性能数据,包括方法的调用次数、执行时间等。
  • 取样完成后,你可以在分析结果中看到每个方法的性能数据,包括方法的调用次数、执行时间占比等。
  • 通过这些数据,你可以找到性能瓶颈并进行优化。例如,你可以发现哪些方法占用了较多的CPU时间或内存空间,并考虑对这些方法进行优化。
    在这里插入图片描述
    在这里插入图片描述

5. Profiler(分析器)标签

作用
Profiler标签提供了对Java应用程序的详细性能分析能力。它可以收集应用程序的方法级性能数据,并帮助你找到性能瓶颈。

用法

  • 在Profiler标签中,你可以选择对CPU或内存进行分析。
  • 分析过程中,VisualVM会收集应用程序的方法级性能数据,包括方法的调用次数、执行时间等。
  • 分析完成后,你可以在分析结果中看到每个方法的性能数据,并可以通过调用树或热点方法视图进行进一步分析。
  • 通过这些数据,你可以深入了解应用程序的性能状况,并找到性能瓶颈。例如,你可以发现哪些方法占用了较多的CPU资源或内存空间,并考虑对这些方法进行优化或重构。
    在这里插入图片描述
    在这里插入图片描述

6.Visual GC插件

作用
将可视垃圾收集监视工具集成到VisualVM中。Visual GC附加到应用程序,并收集并以图形方式显示垃圾收集,类加载器和HotSpot编译器性能数据。
用法
在 VisualVM 中安装插件:点击 工具 -> 插件,选择 可用插件 标签,选中所需插件并点击 安装,然后重启 VisualVM。
在这里插入图片描述

在这里插入图片描述

离线分析

不能直接连接生产环境

VisualVM通常通过JMX(Java Management Extensions)或JDP(Java Debug Wire Protocol)协议直接连接到正在运行的Java应用程序。这种连接方式适用于本地开发环境或测试环境,因为它允许开发者实时监控和分析应用程序的性能。然而,在生产环境中,直接连接通常是不被允许的。
VisualVM为了收集数据需要与目标JVM建立连接并交换信息,这个过程会占用一定的网络带宽和服务器资源,可能会加重服务器的负担,尤其是在高并发或资源紧张的情况下。此外,开放用于远程监控的端口(例如JMX端口)还可能引入安全风险,如果不正确配置防火墙规则和访问控制,可能导致未授权访问,从而威胁到系统的安全性。因此,在生产环境中,通常建议采用分析由jmap和jstack等工具生成的离线文件的方式来进行故障排查和性能调优,这样可以在不影响生产系统的情况下深入分析潜在问题。
在上一篇文章中介绍了使用jmap创建堆转储、jstack生成线程转储,以及设置JVM参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=自动保存内存溢出时的堆转储文件,本文就不再赘述。

加载堆转储文件

启动VisualVM,然后选择“文件”菜单中的“装入”,接着浏览并选择之前保存的.hprof文件即可开始分析。
在这里插入图片描述
在这里插入图片描述

3. MAT(Memory Analyzer Tool)

简介

Memory Analyzer (MAT) 是一个开源工具,由 Eclipse 社区开发和维护。它主要用于分析 Java 堆转储文件,帮助开发者识别内存泄漏、分析内存使用情况、查找大对象等。MAT 提供了丰富的图表和报告,使得内存分析变得更加直观和易于理解

使用场景

MAT 适用于需要深入分析内存问题的场景,尤其是在生产环境中出现内存泄漏或内存溢出时。它的强大分析能力使得运维专家可以快速定位内存问题的根本原因,并提供有效的解决方案。

主要功能

  • 内存泄漏检测:通过分析堆转储文件,识别潜在的内存泄漏问题。
  • 对象占用分析:显示每个对象占用的内存大小,帮助识别内存占用过高的对象。
  • 引用链分析:显示对象的引用链,帮助理解对象的生命周期和引用关系。
  • 报告生成:生成详细的内存分析报告,便于团队共享和讨论。

安装与启动MAT

你可以从Eclipse Memory Analyzer的官方网站下载最新版本的MAT。安装完成后,启动MAT,选择“File”菜单中的“Open Heap Dump”选项,浏览到你的堆转储文件(通常是一个.hprof文件),并打开它。

在这里插入图片描述
常见选项的含义:

  1. Leak Suspects Report:内存泄漏可疑点报告,自动检查堆转储是否存在泄漏嫌疑,报告哪些对象被保存起来,为什么它们没有被垃圾收集,最常用的模式
  2. Component Report: 元件报告,分析一组对象是否存在可疑的内存问题:重复的字符串、空集合、终结器、弱引用等。
  3. Re-open previously run reports: 打开以前的运行报告;

在这里插入图片描述

核心功能

1. 泄露疑点(Leak Suspects)

作用:报错概览标签自动分析当前内存泄漏的主要原因,并列出可能的泄漏点和相关对象。

用法:打开MAT后,加载堆快照文件,报错概览通常会在概览(Overview)页签下的Reports部分显示。用户可以查看列出的内存泄漏嫌疑对象,并通过点击详情(detail)链接获取更详细的信息,包括泄漏对象的最快路径和被引用关系。
在这里插入图片描述
在这里插入图片描述

2. 直方图(Histogram)

作用:直方图列出了堆中每个类及其对应的对象数量和所占用的内存大小,帮助用户了解内存分布情况。

用法:在MAT的概览页签下可以找到直方图。用户可以通过类名(ClassName)进行检索,查看特定类的对象数量和内存占用情况。此外,直方图还支持右键点击对象,查看其引用关系(incoming/outgoing references)。
在这里插入图片描述

3. 支配数(Dominator Tree)

作用:支配数视图以占用总内存的百分比方式列举出所有实例对象,帮助用户发现大内存对象及其依赖关系。

用法:在MAT中,支配数视图通常位于概览页签下。用户可以通过该视图了解哪些对象占用了大量内存,并通过点击对象查看其保留集(Retained Set)和引用关系。支配数视图是分析内存泄漏和优化内存使用的重要工具。
在这里插入图片描述

4. 线程视图(Thread Overview)

作用:线程视图展示了当前进程dump时的所有线程的堆栈信息,帮助用户定位线程执行的方法层级关系和异常问题。

用法:在MAT中,用户可以通过点击一级导航栏中的线程视图图标来打开该视图。在线程视图中,用户可以查看每个线程的堆栈信息,包括线程名称、状态、优先级以及执行的代码行等。这对于分析线程死锁、性能瓶颈等问题非常有帮助。

在这里插入图片描述

5. 顶级消费者(Top Consumers)

作用:Top Consumers标签按照包名和类分组,列出占用内存最多的对象。它帮助开发者快速定位哪些类或包占用了大量内存,从而进行针对性优化。
在这里插入图片描述

5. 重复类(Duplicate Classes)

作用:Duplicate Classes标签用于检测由多个类加载器加载的相同类。在Java应用中,如果同一个类被多个类加载器加载,可能会导致内存浪费和潜在问题。通过Duplicate Classes标签,开发者可以快速识别这些问题。

在这里插入图片描述

总结

在生产问题定位过程中,选择合适的可视化工具可以大大提高问题诊断的效率和准确性。JConsole、VisualVM 和 MAT 是几款常用的工具,它们各自有不同的优势和适用场景。运维专家应根据具体问题的性质和环境选择合适的工具,并结合实际经验进行深入分析。

通过熟练掌握这些工具,运维团队可以更高效地应对生产环境中的各种挑战,确保系统的稳定性和性能。


http://www.niftyadmin.cn/n/5869867.html

相关文章

在线VS离线TTS(语音合成芯片)有哪些优势-AIOT智能语音产品方案

离线 TTS 存在语音质量欠佳、音色选择有限、语言支持单一更新困难、占用资源多、适应性差、难以个性化定制等痛点 01更新维护困难 由于是离线模式,难以及时获取最新的语音数据和算法更新,无法得到持续改进。 02占用本地资源 需要在设备本地存储较大的…

【Spring】统一功能处理

目录 前言 拦截器 什么是拦截器? 拦截器的使用 自定义拦截器 注册并配置拦截器 拦截器详解 拦截路径 拦截器执行流程 适配器模式 统一数据返回格式 优点 统一异常处理 前言 在前面中,我们已经学习了spring中的一些常用操作,那么…

Qt QScrollArea 总结

Qt QScrollArea 总结 1. 功能概述 滚动容器:用于显示超出视口(Viewport)范围的内容,自动提供滚动条。子部件管理:可包裹单个子部件(通过 setWidget()),当子部件尺寸 > 视口时&a…

ARM32汇编 -- align 指令说明及示例

.align 指令说明及示例 .align 指令的作用 .align 是 ARM 汇编中的伪指令,用于将接下来的代码或数据对齐到特定的地址边界。对齐操作可以提高程序的执行效率,确保指令或数据存储在符合处理器要求的地址上。 .align 的语法 .align nn 是一个整数&…

CineMaster: 用于电影文本到视频生成的 3D 感知且可控的框架。

CineMaster是一种 3D 感知且可控的文本到视频生成方法允许用户在 3D 空间中联合操纵物体和相机,以创作高质量的电影视频。 相关链接 论文:cinemaster-dev.github.io 论文介绍 CineMaster是一种用于 3D 感知和可控文本到视频生成的新型框架。目标是让用…

深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全

在当今医疗科技飞速发展的时代,医疗设备的电磁兼容性(EMC)已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性,更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…

ZIP64扩展和普通ZIP文件有什么区别?

ZIP64扩展是ZIP文件格式的一个扩展,旨在解决传统ZIP格式的限制,尤其是文件大小和数量的限制。以下是ZIP64扩展与普通ZIP文件的主要区别: 1. 文件大小限制 普通ZIP文件: 单个文件大小限制为 4GB(2^32字节)。…

【综合项目】api系统——基于Node.js、express、mysql等技术

目录 0 前言 1 初始化 2 注册登录 2.1 注册 2.1.1 功能:密码加密(2.3.3) 2.1.1.1 操作 2.1.1.2 bcryptjs详解 2.1.2 优化:表单数据验证(2.5) 2.1.2.1 过时代码修正 2.1.2.2 关键操作 0 前言 …