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

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

JConsole

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

  • 找到jconsole工具
pdai@MacBook-Pro bin % ls
jaotc		jcmd		jinfo		jshell		rmid
jar		jconsole(这里)	jjs		jstack		rmiregistry
jarsigner	jdb		jlink		jstat		serialver
java		jdeprscan	jmap		jstatd		unpack200
javac		jdeps		jmod		keytool
javadoc		jhsdb		jps		pack200
javap		jimage		jrunscript	rmic
  • 打开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

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