https://gitee.com/vectorx/NOT…
https://codechina.csdn.net/qq…
https://github.com/uxiahnan/N…
[toc]
3. JVM 监控及诊断工具 -GUI 篇
3.1. 工具概述
应用上一章命令行工具或组合能帮您获取指标 Java 利用性能相干的根底信息,但它们存在下列局限:
- 1.无奈获取办法级别的剖析数据,如办法间的调用关系、各办法的调用次数和调用工夫等(这对定位利用性能瓶颈至关重要)。
- 2.要求用户登录到指标 Java 利用所在的宿主机上,应用起来不是很不便。
- 3.剖析数据通过终端输入,后果展现不够直观。
为此,JDK 提供了一些内存透露的剖析工具,如 jconsole,jvisualvm 等,用于辅助开发人员定位问题,然而这些工具很多时候并不足以满足疾速定位的需要。所以这里咱们介绍的工具绝对多一些、丰盛一些。
JDK 自带的工具
- jconsole:JDK 自带的可视化监控工具。查看 Java 应用程序的运行详情、监控堆信息、永恒区(或元空间)应用状况、类加载状况等
- Visual VM:Visual VM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的应用程序的详细信息。
- JMC:Java Mission Control,内置 Java Flight Recorder。可能以极低的性能开销收集 Java 虚拟机的性能数据。
第三方工具
- MAT:MAT(Memory Analyzer Tool)是基于 Eclipse 的内存剖析工具,是一个疾速、功能丰富的 Java heap 剖析工具,它能够帮忙咱们查找内存透露和缩小内存耗费
- JProfiler:商业软件,须要付费。功能强大。
3.2. JConsole
jconsole:从 Java5 开始,在 JDK 中自带的 java 监控和治理控制台。用于对 JVM 中内存、线程和类等的监控,是一个基于 JMX(java management extensions)的 GUI 性能监控工具。
官网地址:https://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html
3.3. Visual VM
Visual VM 是一个功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个 JDK 命令行工具,应用 Visual VM 可用于显示虚拟机过程及过程的配置和环境信息(jps,jinfo),监督应用程序的 CPU、GC、堆、办法区及线程的信息(jstat、jstack)等,甚至代替 JConsole。在 JDK 6 Update 7 当前,Visual VM 便作为 JDK 的一部分公布(VisualVM 在 JDK/bin 目录下)即:它完全免费。
次要性能:
- 1. 生成 / 读取堆内存 / 线程快照
- 2. 查看 JVM 参数和零碎属性
- 3. 查看运行中的虚拟机过程
- 4. 程序资源的实时监控
- 5.JMX 代理连贯、近程环境监控、CPU 剖析和内存剖析
官网地址:https://visualvm.github.io/index.html
3.4. Eclipse MAT
MAT(Memory Analyzer Tool)工具是一款功能强大的 Java 堆内存分析器。能够用于查找内存透露以及查看内存耗费状况。MAT 是基于 Eclipse 开发的,不仅能够独自应用,还能够作为插件的模式嵌入在 Eclipse 中应用。是一款收费的性能剖析工具,应用起来十分不便。
MAT 能够剖析 heap dump 文件。在进行内存剖析时,只有取得了反映以后设施内存映像的 hprof 文件,通过 MAT 关上就能够直观地看到以后的内存信息。一般说来,这些内存信息蕴含:
- 所有的对象信息,包含对象实例、成员变量、存储于栈中的根本类型值和存储于堆中的其余对象的援用值。
- 所有的类信息,包含 classloader、类名称、父类、动态变量等
- GCRoot 到所有的这些对象的援用门路
- 线程信息,包含线程的调用栈及此线程的线程局部变量(TLS)
MAT 不是一个万能工具,它并不能解决所有类型的堆存储文件。然而比拟支流的厂家和格局,例如 Sun,HP,SAP 所采纳的 HPROF 二进制堆存储文件,以及 IBM 的 PHD 堆存储文件等都能被很好的解析。
最吸引人的还是可能疾速为开发人员生成内存透露报表,不便定位问题和剖析问题。尽管 MAT 有如此弱小的性能,然而内存剖析也没有简略到一键实现的水平,很多内存问题还是须要咱们从 MAT 展示给咱们的信息当中通过教训和直觉来判断能力发现。
官网地址:https://www.eclipse.org/mat/downloads.php
3.5. JProfiler
在运行 Java 的时候有时候想测试运行时占用内存状况,这时候就须要应用测试工具查看了。在 eclipse 外面有 Eclipse Memory Analyzer tool(MAT)插件能够测试,而在 IDEA 中也有这么一个插件,就是 JProfiler。JProfiler 是由 ej-technologies 公司开发的一款 Java 利用性能诊断工具。功能强大,然而免费。
特点:
- 使用方便、界面操作敌对(简略且弱小)
- 对被剖析的利用影响小(提供模板)
- CPU,Thread,Memory 剖析性能尤其弱小
- 反对对 jdbc,noSql,jsp,servlet,socket 等进行剖析
- 反对多种模式(离线,在线)的剖析
- 反对监控本地、近程的 JVM
- 跨平台,领有多种操作系统的装置版本
次要性能:
- 1- 办法调用:对办法调用的剖析能够帮忙您理解应用程序正在做什么,并找到进步其性能的办法
- 2- 内存调配:通过剖析堆上对象、援用链和垃圾收集能帮您修复内存泄露问题,优化内存应用
- 3- 线程和锁:JProfiler 提供多种针对线程和锁的剖析视图助您发现多线程问题
- 4- 高级子系统:许多性能问题都产生在更高的语义级别上。例如,对于 JDBC 调用,您可能心愿找出执行最慢的 SQL 语句。JProfiler 反对对这些子系统进行集成剖析
官网地址:https://www.ej-technologies.com/products/jprofiler/overview.html
数据采集形式:
JProfier 数据采集形式分为两种:Sampling(样本采集)和 Instrumentation(重构模式)
Instrumentation:这是 JProfiler 全功能模式。在 class 加载之前,JProfier 把相干性能代码写入到须要剖析的 class 的 bytecode 中,对正在运行的 jvm 有肯定影响。
- 长处:功能强大。在此设置中,调用堆栈信息是精确的。
- 毛病:若要剖析的 class 较多,则对利用的性能影响较大,CPU 开销可能很高(取决于 Filter 的管制)。因而应用此模式个别配合 Filter 应用,只对特定的类或包进行剖析
Sampling:相似于样本统计,每隔肯定工夫(5ms)将每个线程栈中办法栈中的信息统计进去。
- 长处:对 CPU 的开销非常低,对利用影响小(即便你不配置任何 Filter)
- 毛病:一些数据/个性不能提供(例如:办法的调用次数、执行工夫)
注:JProfiler 自身没有指出数据的采集类型,这里的采集类型是针对办法调用的采集类型。因为 JProfiler 的绝大多数外围性能都依赖办法调用采集的数据,所以能够间接认为是 JProfiler 的数据采集类型。
遥感监测 Telemetries
内存视图 Live Memory
Live memory 内存分析:class/class instance 的相干信息。例如对象的个数,大小,对象创立的办法执行栈,对象创立的热点。
- 所有对象 All Objects:显示所有加载的类的列表和在堆上调配的实例数。只有 Java 1.5(JVMTI)才会显示此视图。
- 记录对象 Record Objects:查看特定时间段对象的调配,并记录调配的调用堆栈。
- 调配拜访树 Allocation Call Tree:显示一棵申请树或者办法、类、包或对已抉择类有带正文的调配信息的 J2EE 组件。
- 调配热点 Allocation Hot Spots:显示一个列表,包含办法、类、包或调配已选类的 J2EE 组件。你能够标注以后值并且显示差别值。对于每个热点都能够显示它的跟踪记录树。
- 类追踪器 Class Tracker:类跟踪视图能够蕴含任意数量的图表,显示选定的类和包的实例与工夫。
堆遍历 heap walker
cpu 视图 cpu views
JProfiler 提供不同的办法来记录拜访树以优化性能和细节。线程或者线程组以及线程情况能够被所有的视图抉择。所有的视图都能够汇集到办法、类、包或 J2EE 组件等不同层上。
- 拜访树 Call Tree:显示一个积攒的自顶向下的树,树中蕴含所有在 JVM 中已记录的拜访队列。JDBC,JMS 和 JNDI 服务申请都被正文在申请树中。申请树能够依据 Servlet 和 JSP 对 URL 的不同须要进行拆分。
- 热点 Hot Spots:显示耗费工夫最多的办法的列表。对每个热点都可能显示回溯树。该热点能够依照办法申请,JDBC,JMS 和 JNDI 服务申请以及依照 URL 申请来进行计算。
- 拜访图 Call Graph:显示一个从已选办法、类、包或 J2EE 组件开始的拜访队列的图。
- 办法统计 Method Statistis:显示一段时间内记录的办法的调用工夫细节。
线程视图 threads
JProfiler 通过对线程历史的监控判断其运行状态,并监控是否有线程阻塞产生,还能将一个线程所治理的办法以树状模式出现。对线程分析。
- 线程历史 Thread History:显示一个与线程流动和线程状态在一起的流动时间表。
- 线程监控 Thread Monitor:显示一个列表,包含所有的流动线程以及它们目前的流动情况。
- 线程转储 Thread Dumps:显示所有线程的堆栈跟踪。
线程剖析次要关怀三个方面:
- 1.web 容器的线程最大数。比方:Tomcat 的线程容量应该略大于最大并发数。
- 2.线程阻塞
- 3.线程死锁
监控和锁 Monitors &Locks
所有线程持有锁的状况以及锁的信息。察看 JVM 的外部线程并查看状态:
- 死锁探测图表 Current Locking Graph:显示 JVM 中的以后死锁图表。
- 目前应用的监测器 Current Monitors:显示目前应用的监测器并且包含它们的关联线程。
- 锁定历史图表 Locking History Graph:显示记录在 JVM 中的锁定历史。
- 历史检测记录 Monitor History:显示重大的期待事件和阻塞事件的历史记录。
- 监控器应用统计 Monitor Usage Statistics:显示分组监测,线程和监测类的统计监测数据
3.6. Arthas
上述工具都必须在服务端我的项目过程中配置相干的监控参数,而后工具通过近程连贯到我的项目过程,获取相干的数据。这样就会带来一些不便,比方线上环境的网络是隔离的,本地的监控工具基本连不上线上环境。并且相似于 Jprofiler 这样的商业工具,是须要付费的。
那么有没有一款工具不须要近程连贯,也不须要配置监控参数,同时也提供了丰盛的性能监控数据呢?
阿里巴巴开源的性能剖析神器 Arthas 应运而生。
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者青睐。在线排查问题,无需重启;动静跟踪 Java 代码;实时监控 JVM 状态。Arthas 反对 JDK 6+,反对 Linux/Mac/Windows,采纳命令行交互模式,同时提供丰盛的 Tab 主动补全性能,进一步不便进行问题的定位和诊断。当你遇到以下相似问题而大刀阔斧时,Arthas 能够帮忙你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相干的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无奈在线上 debug,难道只能通过加日志再从新公布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无奈 debug,线下无奈重现!
- 是否有一个全局视角来查看零碎的运行状况?
- 有什么方法能够监控到 JVM 的实时运行状态?
- 怎么疾速定位利用的热点,生成火焰图?
官网地址:https://arthas.aliyun.com/doc/quick-start.html
装置形式:如果速度较慢,能够尝试国内的码云 Gitee 下载。
wget https://io/arthas/arthas-boot.jar
wget https://arthas/gitee/io/arthas-boot.jar
Arthas 只是一个 java 程序,所以能够间接用 java -jar 运行。
除了在命令行查看外,Arthas 目前还反对 Web Console。在胜利启动连贯过程之后就曾经主动启动, 能够间接拜访 http://127.0.0.1:8563/ 拜访,页面上的操作模式和控制台齐全一样。
根底指令
quit/exit 退出以后 Arthas 客户端,其余 Arthas 喜户端不受影响
stop/shutdown 敞开 Arthas 服务端,所有 Arthas 客户端全副退出
help 查看命令帮忙信息
cat 打印文件内容,和 linux 里的 cat 命令相似
echo 打印参数,和 linux 里的 echo 命令相似
grep 匹配查找,和 linux 里的 gep 命令相似
tee 复制标隹输出到规范输入和指定的文件,和 linux 里的 tee 命令相似
pwd 返回以后的工作目录,和 linux 命令相似
cs 清空以后屏幕区域
session 查看以后会话的信息
reset 重置加强类,将被 Arthas 加强过的类全副还原, Arthas 服务端敞开时会重置所有加强过的类
version 输入以后指标 Java 过程所加载的 Arthas 版本号
history 打印命令历史
keymap Arthas 快捷键列表及自定义快捷键
jvm 相干
dashboard 以后零碎的实时数据面板
thread 查看以后 JVM 的线程堆栈信息
jvm 查看以后 JVM 的信息
sysprop 查看和批改 JVM 的零碎属性
sysem 查看 JVM 的环境变量
vmoption 查看和批改 JVM 里诊断相干的 option
perfcounter 查看以后 JVM 的 Perf Counter 信息
logger 查看和批改 logger
getstatic 查看类的动态属性
ognl 执行 ognl 表达式
mbean 查看 Mbean 的信息
heapdump dump java heap,相似 jmap 命令的 heap dump 性能
class/classloader 相干
sc 查看 JVM 已加载的类信息
-d 输入以后类的详细信息,包含这个类所加载的原始文件起源、类的申明、加载的 Classloader 等详细信息。如果一个类被多个 Classloader 所加载,则会呈现屡次
-E 开启正则表达式匹配,默认为通配符匹配
-f 输入以后类的成员变量信息(须要配合参数 - d 一起应用)-X 指定输入动态变量时属性的遍历深度,默认为 0,即间接应用 toString 输入
sm 查看已加载类的办法信息
-d 展现每个办法的详细信息
-E 开启正则表达式匹配, 默认为通配符匹配
jad 反编译指定已加载类的源码
mc 内存编译器,内存编译.java 文件为.class 文件
retransform 加载内部的.class 文件, retransform 到 JVM 里
redefine 加载内部的.class 文件,redefine 到 JVM 里
dump dump 已加载类的 byte code 到特定目录
classloader 查看 classloader 的继承树,urts,类加载信息,应用 classloader 去 getResource
-t 查看 classloader 的继承树
-l 按类加载实例查看统计信息
-c 用 classloader 对应的 hashcode 来查看对应的 Jar urls
monitor/watch/trace 相干
monitor 办法执行监控,调用次数、执行工夫、失败率
-c 统计周期,默认值为 120 秒
watch 办法执行观测,能察看到的范畴为:返回值、抛出异样、入参,通过编写 groovy 表达式进行对应变量的查看
-b 在办法调用之前察看(默认敞开)
-e 在办法异样之后察看(默认敞开)
-s 在办法返回之后察看(默认敞开)
-f 在办法完结之后 (失常返回和异样返回) 察看(默认开启)
-x 指定输岀后果的属性遍历深度, 默认为 0
trace 办法外部调用门路, 并输入办法门路上的每个节点上耗时
-n 执行次数限度
stack 输入以后办法被调用的调用门路
tt 办法执行数据的时空隧道, 记录下指定办法每次调用的入参和返回信息, 并能对这些不同的工夫下调用进行观测
其余
jobs 列出所有 job
kill 强制终止工作
fg 将暂停的工作拉到前台执行
bg 将暂停的工作放到后盾执行
grep 搜寻满足条件的后果
plaintext 将命令的后果去除 ANSI 色彩
wc 按行统计输入后果
options 查看或设置 Arthas 全局开关
profiler 应用 async-profiler 对利用采样,生成火焰图
3.7. Java Misssion Control
在 Oracle 收买 Sun 之前,Oracle 的 JRockit 虚拟机提供了一款叫做 JRockit Mission Control 的虚拟机诊断工具。
在 Oracle 收买 sun 之后,Oracle 公司同时领有了 Hotspot 和 JRockit 两款虚拟机。依据 Oracle 对于 Java 的策略,在今后的倒退中,会将 JRokit 的优良个性移植到 Hotspot 上。其中一个重要的改良就是在 Sun 的 JDK 中退出了 JRockit 的反对。
在 Oracle JDK 7u40 之后,Mission Control 这款工具己经绑定在 Oracle JDK 中公布。
自 Java11 开始,本节介绍的 JFR 己经开源。但在之前的 Java 版本,JFR 属于 Commercial Feature 通过 Java 虚拟机参数 -XX:+UnlockCommercialFeatures 开启。
Java Mission Control(简称 JMC),Java 官网提供的性能强劲的工具,是一个用于对 Java 应用程序进行治理、监督、概要剖析和故障排除的工具套件。它蕴含一个 GUI 客户端以及泛滥用来收集 Java 虚拟机性能数据的插件如 JMX Console(可能拜访用来寄存虚拟机齐个于零碎运行数据的 MXBeans)以及虚拟机内置的高效 profiling 工具 Java Flight Recorder(JFR)。
JMC 的另一个长处就是:采纳取样,而不是传统的代码植入技术,对利用性能的影响十分十分小,齐全能够开着 JMC 来做压测(惟一影响可能是 full gc 多了)。
官网地址:https://github.com/JDKMissionControl/jmc
Java Flight Recorder
Java Flight Recorder 是 JMC 的其中一个组件,可能以极低的性能开销收集 Java 虚拟机的性能数据。与其余工具相比,JFR 的性能开销很小,在默认配置下均匀低于 1%。JFR 可能间接拜访虚拟机内的敌据并且不会影响虚拟机的优化。因而它十分实用于生产环境下满负荷运行的 Java 程序。
Java Flight Recorder 和 JDK Mission Control 独特创立了一个残缺的工具链。JDK Mission Control 可对 Java Flight Recorder 间断收集低水平和具体的运行时信息进行高效、具体的剖析。
当启用时 JFR 将记录运行过程中产生的一系列事件。其中包含 Java 层面的事件如线程事件、锁事件,以及 Java 虚拟机外部的事件,如新建对象,垃圾回收和即时编译事件。依照产生机会以及持续时间来划分,JFR 的事件共有四种类型,它们别离为以下四种:
- 刹时事件(Instant Event),用户关怀的是它们产生与否,例如异样、线程启动事件。
- 继续事件(Duration Event),用户关怀的是它们的持续时间,例如垃圾回收事件。
- 计时事件(Timed Event),是时长超出指定阈值的继续事件。
- 取样事件(Sample Event),是周期性取样的事件。
取样事件的其中一个常见例子便是办法抽样(Method Sampling),即每隔一段时问统计各个线程的栈轨迹。如果在这些抽样获得的栈轨迹中存在一个重复呈现的办法,那么咱们能够揣测该办法是热点办法
3.8. 其余工具
Flame Graphs(火焰图)
在谋求极致性能的场景下,理解你的程序运行过程中 cpu 在干什么很重要,火焰图就是一种十分直观的展现 CPU 在程序整个生命周期过程中工夫调配的工具。火焰图对于古代的程序员不应该生疏,这个工具能够十分直观的显示出调用找中的 CPU 耗费瓶颈。
网上的对于 Java 火焰图的解说大部分来自于 Brenden Gregg 的博客 http://new.brendangregg.com/flamegraphs.html
火焰图,简略通过 x 轴横条宽度来度量工夫指标,y 轴代表线程栈的档次。
Tprofiler
案例:应用 JDK 本身提供的工具进行 JVM 调优能够将下 TPS 由 2.5 晋升到 20(晋升了 7 倍),并精确 定位系统瓶颈。
零碎瓶颈有:利用里释态对象不是太多、有大量的业务线程在频繁创立一些生命周期很长的长期对象,代码里有问题。
那么,如何在海量业务代码里边精确定位这些性能代码?这里应用阿里开源工具 Tprofiler 来定位 这些性能代码,胜利解决掉了 GC 过于频繁的性能瓶预,并最终在上次优化的根底上将 TPS 再晋升了 4 倍,即晋升到 100。
- Tprofiler 配置部署、近程操作、日志阅谈都不太简单,操作还是很简略的。然而其却是可能 起到切中时弊、空谷传声的成果,帮咱们解决了 GC 过于频繁的性能瓶预。
- Tprofiler 最重要的个性就是可能统汁出你指定时间段内 JVM 的 top method 这些 top method 极有可能就是造成你 JVM 性能瓶颈的首恶。这是其余大多数 JVM 调优工具所不具备的,包含 JRockit Mission Control。JRokit 首席开发者 Marcus Hirt 在其私人博客《Lom Overhead Method Profiling cith Java Mission Control》下的评论中曾明确指出 JRMC 井不反对 TOP 办法的统计。
官网地址:http://github.com/alibaba/Tprofiler
Btrace
常见的动静追踪工具有 BTrace、HouseHD(该我的项目己经进行开发)、Greys-Anatomy(国人开发 集体开发者)、Byteman(JBoss 出品),留神 Java 运行时追踪工具井不限干这几种,然而这几个是绝对比拟罕用的。
BTrace 是 SUN Kenai 云计算开发平台下的一个开源我的项目,旨在为 java 提供安全可靠的动静跟踪剖析工具。先看一卜日 Trace 的官网定义:
大略意思是一个 Java 平台的平安的动静追踪工具,能够用来动静地追踪一个运行的 Java 程序。BTrace 动静调整指标应用程序的类以注入跟踪代码(“字节码跟踪“)。
YourKit
JProbe
Spring Insight