调试排错 - Java 问题排查之JVM可视化工具

本文主要梳理常见的JVM可视化的分析工具,主要包括JConsole, Visual VM, Vusial GC, JProfile 和 MAT等。@javaxue

JConsole

Jconsole (Java Monitoring and Management Console),JDK自带的基于JMX的可视化监视、管理工具。 官方文档可以参考 这里 在新窗口打开

  • 找到jconsole工具
javaxue@MacBook-Pro bin % ls
jaotcjcmdjinfojshellrmid
jarjconsole(这里)jjsjstackrmiregistry
jarsignerjdbjlinkjstatserialver
javajdeprscanjmapjstatdunpack200
javacjdepsjmodkeytool
javadocjhsdbjpspack200
javapjimagejrunscriptrmic
  • 打开jconsole

选择

  • 查看概述、内存、线程、类、VM概要、MBean

概述

内存

线程

VM概要

MBean

Visual VM

VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。

Overview

Monitor

线程

Sampler

Visual GC

visual gc 是 visualvm 中的图形化查看 gc 状况的插件。官方文档可以参考 这里 在新窗口打开

比如我在IDEA中使用visual GC 插件来看GC状况。

JProfile

Profiler 是一个商业的主要用于检查和跟踪系统(限于Java开发的)的性能的工具。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。

JProfiler 是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。 JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能。

核心组件

JProfiler 包含用于采集目标 JVM 分析数据的 JProfiler agent、用于可视化分析数据的 JProfiler UI、提供各种功能的命令行工具,它们之间的关系如下图所示。

  • JProfiler agent

JProfiler agent 是一个本地库,它可以在 JVM 启动时通过参数 -agentpath:<path to native library> 进行加载或者在程序运行时通过 JVM Attach 机制 在新窗口打开 进行加载。Agent 被成功加载后,会设置 JVMTI 环境,监听虚拟机产生的事件,如类加载、线程创建等。例如,当它监听到类加载事件后,会给这些类注入用于执行度量操作的字节码。

  • JProfiler UI

JProfiler UI 是一个可独立部署的组件,它通过 socket 和 agent 建立连接。这意味着不论目标 JVM 运行在本地还是远端,JProfiler UI 和 agent 间的通信机制都是一样的。

JProfiler UI 的主要功能是展示通过 agent 采集上来的分析数据,此外还可以通过它控制 agent 的采集行为,将快照保存至磁盘,展示保存的快照。

  • 命令行工具

JProfiler 提供了一系列命令行工具以实现不同的功能。

  1. jpcontroller - 用于控制 agent 的采集行为。它通过 agent 注册的 JProfiler MBean 向 agent 传递命令。
  2. jpenable - 用于将 agent 加载到一个正在运行的 JVM 上。
  3. jpdump - 用于获取正在运行的 JVM 的堆快照。
  4. jpexport & jpcompare - 用于从保存的快照中提取数据并创建 HTML 报告。

运行测试

我们运行一个SpringBoot测试工程,选择attach到JVM

选择指定的进程

设置数据采集模式

JProfier 提供两种数据采集模式 Sampling 和 Instrumentation。

  • Sampling - 适合于不要求数据完全精确的场景。优点是对系统性能的影响较小,缺点是某些特性不支持(如方法级别的统计信息)。
  • Instrumentation - 完整功能模式,统计信息也是精确的。缺点是如果需要分析的类比较多,对应用性能影响较大。为了降低影响,往往需要和 Filter 一起使用。

由于我们需要获取方法级别的统计信息,这里选择了 Instrumentation 模式。

概览

内存

实时内存分布(类对象)

dump 堆内存

dump完会直接打开显示

线程存储

导出HTML报告

CPU 调用树

线程历史

JEE & 探针

MBeans

Eclipse Memory Analyzer (MAT)

MAT 是一种快速且功能丰富的 Java 堆分析器,可帮助你发现内存泄漏并减少内存消耗。 MAT在的堆内存分析问题使用极为广泛,需要重点掌握。

可以在 这里 在新窗口打开 下载, 官方文档可以看 这里 在新窗口打开

  • Overview

包含内存分布,以及潜在的问题推测

  • Histogram

可以列出内存中的对象,对象的个数以及大小。

具体需要重点理解如下两个概念,可参考 官网文档 在新窗口打开 的解释

  1. Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
  2. Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和
  • Dominator Tree

可以列出那个线程,以及线程下面的那些对象占用的空间。

  • Top consumers

通过图形列出最大的object。

  • Leak Suspects

自动分析潜在可能的泄漏。