JVM监控及诊断工具-GUI上篇

“这是我参与更文挑战的第4天,活动详情查看: 更文挑战

上篇介绍了JVM监控及诊断工具-命令行下篇,接下来给大家简单介绍下JVM监控及诊断工具-GUI上篇。

一、工具概述

使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:

  1. 无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。
  2. 要求用户登录到目标Java应用所在的宿主机上,使用起来不是很方便。
  3. 分析数据通过终端输出,结果展示不够直观。

为此,JDK提供了一些内存泄漏的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对要多一些、丰富一些。

图形化综合诊断工具

JDK自带的工具

  1. jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概述、监控堆信息、永久区(或元空间)使用情况、类加载情况等。位置:jdk\bin\jconsole.exe
  2. Visual VM:Visual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。位置:jdk\bin\jvisualvm.ext
  3. JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。

第三方工具

  1. MAT:MAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗,Eclipse的插件形式。
  2. JProfiler:商业软件,需要付费。功能强大。与VisualVM类似
  3. Arthas:Alibaba开源的Java诊断工具。深受开发者喜爱。
  4. Btrace:Java运行时追踪工具。可以在不停机的情况下,跟踪指定的方法调用、构造函数调用和系统内存等信息。

二、jConsole

基本概念

  1. 从Java5开始,在JDK中自带的java监控和管理控制台。
  2. 用于对JVM中内存、线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监控工具。
  3. 官方教程:docs.oracle.com/javase/7/do…

启动

  1. jdk/bin目录下,启动jconsole.exe命令即可
  2. 不需要使用jps命令来查询

三、Visual VM

基本概念

  1. Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。
  2. 它集成了多个JDK命令行工具,使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监控应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等,甚至代替JConsole。
  3. 在JDK 6 update 7以后,Visual VM便作为JDK的一部分发布(VisualVM 在JDK/bin目录下),即:它完全免费。此外,Visual VM也可以作为独立的软件安装:visualvm.github.io/index.html

插件的安装

  1. Visual VM的一大特点是支持插件扩展,并且插件安装非常方便。我们既可以离线下载插件文件*.nbm,然后在Plugin对话框的已下载页面下,添加已下载的插件。也可以在可用插件页面下,插件地址:visualvm.github.io/pluginscent…
  2. IDEA安装VisualVM Launcher插件 Preferences –> Plugins –> 搜索VisualVM Launcher,安装重启即可。

主要功能

  1. 生成/读取堆内存快照
  2. 查看JVM参数和系统属性
  3. 查看运行中的虚拟机进程
  4. 生成/读取线程快照
  5. 程序资源的实时监控

四、eclipse MAT

基本概述

  1. MAT(Memory Analyzer Tool)工具是一款功能强大的Java堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。
  2. MAT是基于Eclipse开发的,不仅可以单独使用,还可以作为插件的形式嵌入在Eclipse中使用。是一款免费的性能分析工具,使用起来非常方便。大家可以在www.eclipse.org/mat/downloa…

获取堆dump文件

  1. dump文件内容
  2. 获取dump文件

方法一:通过前一章介绍的jmap工具生成,可以生成任意一个java进程的dump文件;

方法二:通过配置JVM参数生成。选项”-XX:+HeapDumpOnOutOfMemoryError” 或 “-XX:+HeapDumpBeforeFullGC”
选项”-XX:+HeapDumpPath”所代表的含义就是当程序出现OutofMemory时,将会在相应的目录下生成一份dump文件。如果不指定选项”-XX:HeapDumpPath”则在当前目录下生成dump文件。

对比:考虑到生产环境中几乎不可能在线对其进行分析,大都是采用离线分析,因此使用jmap+MAT工具是最常见的组合。

方法三:使用VisualVM可以导出堆dump文件

方法四:使用MAT既可以打开一个已有的堆快照,也可以通过MAT直接从活动Java程序中导出堆快照。该功能将借助jps列出当前正在运行的Java进程,以供选择并获取快照。

分析堆dump文件

histogram

MAT的直方图和jmap的-histo子命令一样,都能够展示各个类的实例数目以及这些实例的Shallow heap总和。但是,MAT的直方图还能够计算 Retained heap,并支持基于实例数目或 Retaiined heap的排序方式(默认为Shallow heap)。

此外,MAT还可以将直方图中的类按照超类、类加载器或者包名分组。

当选中某个类时,MAT界面左上角的Inspector窗口将展示该类的Class实例的相关信息,如类加载器等。

展示了各个类的实例数目以及这些实例的Shallow heap或 Retainedheap的总和

thread overview

  1. 查看系统中的Java线程
  2. 查看局部变量的信息

获得对象相互引用的关系

  1. with outgoing references
  2. with incoming references

浅堆与深堆

shallow heap

  1. 浅堆(Shallow Heap)是指一个对象所消耗的内存。在32位系统中,一个对象引用会占据4个字节,一个int类型会占据4个字节,long型变量会占据8个字节,每个对象头需要占用8个字节。根据堆快照格式不同,对象的大小可能会向8个字节进行对齐。
  2. 以String为例:2个int值共占8个字节,对象引用占用4个字节,对象头8个字节,合计20字节,向8字节对齐,故占24字节。(jdk7中)
  3. 这24字节为String对象的浅堆大小。它与String的value实际取值无关,无论字符串长度如何,浅堆大小始终是24字节

retained heap

  1. 保留集(Retained Set):对象A的保留集指当对象A被垃圾回收后,可以释放的所有的对象集合(包括对象A本身),即对象A的保留集可以被认为是只能通过对象A被直接或间接访问到的所有对象的集合。通俗地说,就是指仅被对象A所持有的对象的集合。
  2. 深堆(Retained Heap):深堆是指对象的保留集中所有的对象的浅堆大小之和。
  3. 注意:浅堆指对象本身占用的内存,不包括其内部引用对象的大小。一个对象的深堆指只能通过该对象访问到的(直接或间接)所有对象的浅堆之和,即对象被回收后,可以释放的真实空间。

对象实际大小

  1. 对象的实际大小定义为一个对象所能触及的所有对象的浅堆大小之和,也就是通常意义上我们说的对象大小。与深堆相比,似乎这个在日常开发中更为直观和被人接受,但实际上,这个概念和垃圾回收无关。
  2. 下图显示了一个简单的对象引用关系图,对象A引用了C和D,对象B引用了C和E。那么对象A的浅堆大小只是A本身,不含C和D,而A的实际大小为A、C、D三者之和。而A的深堆大小为A与D之和,由于对象C还可以通过对象B访问到,因此不再对象A的深堆范围内。

image.png

五、总结

简单介绍了下JVM自带的图形化监控命令GUI上篇,下一篇介绍JVM监控及诊断工具-GUI下篇。

欢迎大家关注公众号互相学习、互相交流。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享