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

举报
龙哥手记 发表于 2022/12/23 15:20:47 2022/12/23
【摘要】 《第六十七篇 JVM可视化的分析工具》

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。