第3章 JVM监控及诊断工具_GUI篇

第1章 JVM调优前言篇
第2章 JVM监控及诊断工具_命令行篇
第3章 JVM监控及诊断工具_GUI篇
第4章 JVM运行时参数篇
第5章 JVM中GC日志分析篇

1 GUI工具概述

1.1 为什么要用GUI工具

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

  1. 无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。
  2. 要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便。
  3. 分析数据通过终端输出,结果展示不够直观。
    为此,JDK提供了一些内存泄漏的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。

1.2 图形化诊断工具有哪些?

1.2.1 JDK自带的工具.

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

1.2.2 第三方工具

MAT:MAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。(Eclipse的插件形式)。
JProfiler:商业软件,需要付费。功能强大。

2 jconsole

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

2.1 启动jconsole

方法一:在jdk安装目录中找到jconsole.exe,双击该可执行文件就可以。
方法二:打开DOS窗口,直接输入jconsole就可以了。

2.2 jconsole三种连接方式

测试类:com.michael.guitest.jconsole.HeapInstanceTest

2.2.1 Local 连接

使用JConsole连接一个正在本地系统运行的JVM,并且执行程序的和运行JConsole的需要是同一个用户。JConsole使用文件系统的授权通过RMI连接起链接到平台的MBean的服务器上。这种从本地连接的监控能力只有Sun的JDK具有。

注意:本地连接要求 启动jconsole的用户 和 运行当前程序的用户 是同一个用户
1、连接

2、概览

3、内存

3、根据线程检测死锁
测试类: com.michael.guitest.jconsole.ThreadDeadLock

关于死锁的测试:https://blog.csdn.net/Michael_lcf/article/details/123995818

4、VM 概要

2.2.2 Remote 连接

使用下面的URL通过RMI连接器连接到一个JMX代理。
service:jmx:rmi:///jndi/
rmi://hostName:portNum/jmxrmi
JConsole为建立连接,需要在环境变量中设置mx.remote.credentials来指定用户名和密码,从而进行授权。

2.2.3 Advanced 连接

使用一个特殊的URL连接JMX代理。一般情况使用自己定制的连接器而不是RMI提供的连接器来连接JMX代理,或者是一个使用JDK1.4的实现了JMX和JMX Rmote的应用

3 jvisualvm

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

jvisualvm和visual vm的区别:
visual vm是单独下载的工具,然后将visual vm结合到jdk中就变成了jvisualvm,仅仅是添加了一个j而已,这个j应该是java的用处,所以说jvisualvm其实就是visual vm。

3.1 visualvm安装

Visual VM的一大特点是支持插件扩展,并且插件安装非常方便。

3.1.1 visualvm插件在线安装

在这里插入图片描述

3.1.2 visualvm插件离线安装

我们可以通过离线下载插件文件 *.nbm,然后在Plugin对话框的已下载页面下,添加已下载的插件。(建议安装上:VisualGC)
插件地址:https://visualvm.github.io/pluginscenters.html

3.1.3 idea安装visualvm插件

1、在IDEA中、Setting、Plugins搜索安装 VisualVM Launcher插件;重启。
2、重启IDEA,然后配置该插件。
在这里插入图片描述
3、运行效果
还是打开jvisualvm界面,只是不需要我们手动打开jvisualvm。

3.2 连接方式

3.2.1 本地连接方式

监控本地Java进程的CPU、类、线程等。

3.2.2 远程连接方式

1、确定远程服务器的ip地址。
2、添加JMX(通过JMX技术具体监控远程服务器哪个Java进程)。
3、修改bin/catalina.sh文件,连接远程的tomcat。
4、在…/conf中添加jmxremote.access和jmxremote.password文件。
5、将服务器地址改成公网ip地址。
6、设置阿里云安全策略和防火墙策略。
7、启动tomcat,查看tomcat启动日志和端口监听。
8、JMX中输入端口号、用户名、密码登录。

3.3 主要功能

1.生成/读取堆内存快照。
2.查看JVM参数和系统属性。
3.查看运行中的虚拟机进程。
4.生成/读取线程快照。
5.程序资源的实时监控。
6.其他功能(JMX代理连接、远程环境监控、CPU分析和内存分析)。

3.4 Try It

com.michael.guitest.jvisualvm.HeapInstanceTest
com.michael.guitest.jvisualvm.OOMTest

3.4.1 jvisualvm 概述Tab

在这里插入图片描述

3.4.2 jvisualvm 监视Tab

在这里插入图片描述

3.4.2.1 导出保存“堆Dump”

在这里插入图片描述

3.4.2.2 导入已保存的“堆Dump”

在这里插入图片描述

3.4.2.3 “堆Dump”文件分析

在这里插入图片描述

3.4.3 jvisualvm 线程Tab

在这里插入图片描述

3.4.3.1 “线程Dump”文件分析

保存、装入 同 “堆Dump”。
在这里插入图片描述

3.4.4 jvisualvm 抽样器Tab

3.4.4.1 jvisualvm CPU 抽样

在这里插入图片描述
在这里插入图片描述

3.4.4.2 jvisualvm 内存 抽样

在这里插入图片描述

在这里插入图片描述

3.4.5 jvisualvm Profiler Tab

3.4.6 jvisualvm VisualGC Tab

在这里插入图片描述

4 eclipse MAT

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

最吸引人的是 能够快速为开发人员生成内存泄漏报表,方便 定位问题分析问题。虽然MAT有如此强大的功能,但是内存分析也没有简单到一键完成的程度,很多内存问题还是需要我们从MAT展现给我们的信息当中通过经验和直觉来判断才能发现。

  1. eclipse插件形式安装Memory Analyzer
    在这里插入图片描述

  2. 独立软件形式安装Memory Analyzer
    根据java版本 下载、解压 相应的 Memory Analyzer 即可使用。https://www.eclipse.org/mat/previousReleases.php
    在这里插入图片描述

4.1 获取堆dump文件

4.1.1 MAT对dump文件的分析项

MAT可以分析 heap dump文件。在进行内存分析时,只要获得了反映当前设备内存映像的 hprof文件,通过MAT打开就可以直观地看到当前的内存信息。这些内存信息一般包含如下列举:

  • 所有的 对象信息,包括 对象实例成员变量存储于栈中的基本类型值存储于堆中的其他对象的引用值
  • 所有的 类信息,包括 classloader类名称父类静态变量等。
  • GCRoot所有的这些对象的引用路径。
  • 线程信息,包括线程的调用栈及此线程的线程局部变量 (TLS)。

4.1.2 mat对dump文件类型的支持

MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如Sun,HP,SAP 所采用的 hprof二进制堆存储文件,以及 IBM 的 pdh堆存储文件 等都能被很好的解析。

4.1.3 获取dump文件

  • 方法一:
    通过 jmap工具生成,可以生成任意一个java进程的 dump文件。

  • 方法二:
    通过配置JVM参数生成。
    1、选项 -XX:+HeapDumpOnOutofMemoryError-XX:+HeapDumpBeforeFullGC
    2、选项 -XX:HeapDumpPath 所代表的含义就是当程序出现OutOfMemory时,将会在相应的目录下生成一份dump文件。如果不指定选项 -XX:HeapDumpPath 则在当前目录下生成dump文件。
    对比:考虑到生产环境中几乎不可能在线对其进行分析,大都是采用离线分析,因此使用 jmap + MAT 工具是最常见的组合。

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

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

4.2 分析堆dump文件

4.3 案例:Tomcat堆溢出分析

问题:
Tomcat是最常用的Java Servlet容器之一,同时也可以当做单独的Web服务器使用。Tomcat本身使用Java实现,并运行于Java虚拟机之上。在大规模请求时,Tomcat有可能会因为无法承受压力而发生内存溢出错误。这里根据一个被压垮的Tomcat的堆快照文件,来分析Tomcat在崩溃时的内部情况。

分析过程:

4.4 支持使用OQL语言查询对象信息

SELECT子句

FROM子句

WHERE子句

内置对象与方法

补充1:再谈内存泄漏

补充2: 支持使用OQL语言查询对象信息

5 JProfiler

6 Arthas

7 Java Mission Control

08-其它工具

猜你喜欢

转载自blog.csdn.net/Michael_lcf/article/details/129584465