JVM 监控及诊断工具:GUI

命令行局限

1、无法获取方法级别的分析数据,如:方法间的调用关系、各方法的调用次数和调用时间等

2、要求用户登录到目标 Java 应用所在的宿主机上,使用不方便

3、分析数据通过终端输出,结果展示不够直观

 

JDK 工具

1、jconsole

(1)可视化监控工具

(2)查看 Java 应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等

2、Visual VM

(1)可视界面

(2)查看 JVM 上,基于 Java 技术,运行的应用程序的详细信息

3、JMC

(1)Java Mission Control

(2)内置 Java Flight Recorder,能以极低的性能开销,收集 JVM 性能数据

 

第三方工具

1、MAT

(1)Memory Analyzer Tool

(2)基于 Eclipse 内存分析工具

(3)分析 Java heap,查找内存泄漏、减少内存消耗

2、JProfiler:商业软件

 

JConsole

1、从 Java 5 开始,在 JDK 中自带的 Java 监控和管理控制台

2、监控 JVM 中内存、线程、类等

3、基于 JMX(Java Management Extensions)的 GUI 性能监控工具

 

Visual VM

1、故障诊断、性能监控的可视化工具,集成多个 JDK 命令行工具

(1)显示虚拟机进程、进程配置、进程环境信息(jps,jinfo)

(2)监视应用程序 CPU、GC、堆、方法区、线程信息(jstat、jstack)等,甚至代替 JConsole

2、在 JDK 6 Update 7 后,Visual VM 作为 JDK 一部分发布,VisualVM 在 JDK/bin 目录下

3、主要功能

(1)生成 / 读取堆内存 / 线程快照

(2)查看 JVM 参数和系统属性

(3)查看运行中的虚拟机进程

(4)程序资源的实时监控

(5)JMX 代理连接、远程环境监控、CPU 分析、内存分析

 

Eclipse MAT

1、MAT:Memory Analyzer Tool

(1)基于 Eclipse 开发,可以单独使用,还可以作为插件嵌入在 Eclipse 中使用

(2)Java 堆内存分析器:查找内存泄漏、查看内存消耗情况

2、分析 heap dump 文件

(1)在进行内存分析时,需要获得反映当前设备内存映像的 .hprof 文件

(2)MAT 可以直观查看当前的内存信息

(3)快速为开发人员生成内存泄漏报表,方便定位、分析问题

3、内存信息

(1)所有的对象信息:对象实例、成员变量、存储于栈中的基本类型值、存储于堆中的其他对象的引用值

(2)所有的类信息:Classloader、类名称、父类、静态变量等

(3)GC Roots 到所有对象的引用路径

(4)线程信息:线程的调用栈、此线程的线程局部变量(TLS)

4、MAT 不能处理所有类型的堆存储文件

(1)Sun、HP、SAP 的 HPROF 二进制堆存储文件

(2)IBM 的 PHD 堆存储文件等

5、MAT 支持使用 OQL 语言查询对象信息

 

OQL

1、Object Query Language

2、类似于 SQL 的查询语言,使用类 SQL 语法,可以在堆中查找、筛选对象

3、SELECT 子句

(1)在 MAT 中,Select 子句格式与 SQL 基本一致,用于指定要显示的列

(2)Select 子句中可以使用 *,查看结果对象的引用实例,等价于 outgoing references

SELECT * FROM java.util.Vector v

(3)使用 OBJECTS 关键字,可以将返回结果集中的项以对象的形式显示

SELECT OBJECTS v.elementData FROM java.util.Vector v
SELECT OBJECTS s.value FROM java.lang.String s

(4)在 Select 子句中,使用 AS RETAINED SET 关键字,可以得到所得对象的保留集

SELECT AS RETAINED SET *FROM 指定包路径

(5)DISTINCT 关键字用于在结果集中去除重复对象

SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s

4、FROM 子句

(1)From 子句用于指定查询范围,它可以指定类名、正则表达式或者对象地址

SELECT * FROM java.lang.String s

(2)使用正则表达式,限定搜索范围,输出所有指定包下所有类的实例

SELECT * FROM "com\..*"

(3)使用类的地址进行搜索,可以区分被不同 ClassLoader 加载的同一种类型

SELECT * FROM 0x37a0b4d

5、WHERE 子句

(1)Where 子句用于指定 OQL 的查询条件

(2)OQL 查询将只返回满足 Where 子句指定条件的对象

(3)Where 子句的格式与传统 SQL 极为相似

(4)返回长度大于 10 的 char 数组(例)

SELECT * FROM Ichar[] s WHERE s.@length>10

(5)返回包含 java 子字符串的所有字符串,使用 LIKE 操作符,LIKE 操作符的操作参数为正则表达式(例)

SELECT * FROM java.lang.String s WHERE toString(s) LIKE ".*java.*"

(6)返回所有 value 域不为 null 的字符串,使用 = 操作符(例)

SELECT * FROM java.lang.String s where s.value!=null

(7)返回数组长度大于 15,并且深堆大于 1000 字节的所有 Vector 对象(例)

SELECT * FROM java.util.Vector v WHERE v.elementData.@length>15 AND v.@retainedHeapSize>1000

6、内置对象与方法

(1)OQL 中可以访问堆内对象的属性,也可以访问堆内代理对象的属性

(2)访问堆内对象的属性时,格式如下,其中 alias 为对象名称

[ <alias>. ] <field> . <field>. <field>

(3)访问 java.io.File 对象的 path 属性,并进一步访问 path 的 value 属性(例)

SELECT toString(f.path.value) FROM java.io.File f

(4)显示 String 对象的内容、objectid 和 objectAddress(例)

SELECT s.toString(),s.@objectId, s.@objectAddress FROM java.lang.String s

(5)显示 java.util.Vector 内部数组的长度(例)

SELECT v.elementData.@length FROM java.util.Vector v

(6)显示所有的 java.util.Vector 对象及其子类型(例)

select * from INSTANCEOF java.util.Vector

 

JProfiler

1、IDEA 插件,Java 应用性能诊断工具

2、特点

(1)使用方便、界面操作友好

(2)对被分析的应用影响小(提供模板)

(3)分析 CPU、Thread、Memory 功能强大

(4)支持对 jdbc、noSql、jsp、servlet、socket 等进行分析

(5)支持多种模式(离线 / 在线)分析

(6)支持监控本地、远程 JVM

(7)跨平台,拥有多种操作系统的安装版本

3、主要功能

(1)分析方法调用

(2)分析堆上对象、引用链、垃圾收集能,修复内存泄露、优化内存使用

(3)JProfiler 提供多种对线程、锁的分析视图

(4)高级子系统:多数性能问题发生在更高的语义级别上,如:调用 JDBC,找出执行最慢 SQL 语句,JProfiler 支持对这些子系统进行集成分析

4、数据采集方式

(1)样本采集:Sampling

(2)重构模式:Instrumentation

(3)JProfiler 本身没有指出数据的采集类型,是针对方法调用的采集类型,因为 JProfiler 绝大多数核心功能都依赖方法调用采集的数据,所以可以直接认为是 JProfiler 数据采集类型

5、Instrumentation

(1)JProfiler 全功能模式

(2)在 .class 加载之前,JProfier 把相关功能代码,写入到需要分析的 .class 的字节码中,对正在运行 JVM 有一定影响

(3)优点:此设置中,调用堆栈信息是准确的

(4)缺点:若要分析 .class 较多,则影响应用性能较大,CPU 开销很高(取决于 Filter 控制)

(6)使用此模式一般配合 Filter 使用,只分析特定的类、包

6、Sampling

(1)类似于样本统计,每隔 5 ms,统计每个线程栈中方法栈中的信息

(2)优点:CPU 开销非常低,对应用影响小,即使不配置任何 Filter

(3)缺点:不能提供某些数据/特性,如:方法的调用次数、执行时间

7、遥感监测(Telemetries)

(1)概览 Overview:该以图表形式,汇总当前应用服务器的资源使用情况

(2)内存占用 Memory:,统计内存已使用空间、空闲空间

(3)堆实例对象记录 Record Objects:,以数组形式、非数组形式,分类记录堆上的对象和数组数量

(4)对象创建回收记录 Record Throughput:,记录单位时间间隔内,对象创建、回收数量

(5)垃圾回收 GC Activity:,统计垃圾回收率

(6)类加载数量 Classes:,分为 CPU 已加载、CPU 未加载

(7)线程活动状态 Thread:,线程活动数量

(8)CPU Load:单位时间间隔内 CPU 占有率

8、内存视图(Live Memory)

(1)Class/Class 实例的相关信息,如:对象的个数、大小、对象创建的方法执行栈、对象创建的热点

(2)所有对象 All Objects:显示所有加载类的列表、在堆上分配的实例数,只有 Java 1.5(JVMTI)才会显示此视图

(3)记录对象 Record Objects:查看特定时间段对象的分配,并记录分配的调用堆栈

(4)分配访问树 Allocation Call Tree:显示一棵请求树:方法、类、包、对已选择类有带注释的分配信息的 J2EE 组件

(5)分配热点 Allocation Hot Spots:显示一个列表:方法、类、包、分配已选择类的 J2EE 组件,可以标注当前值,且显示差异值,对于每个热点都可以显示它的跟踪记录树

(6)类追踪器 Class Tracker:包含任意数量的图表、显示选定的类和包的实例与时间

9、堆遍历视图(Heap Walker)

(1)查看对象的引用关系

(2)通过查看对象堆内存具体分配情况,常用来查找内存泄漏

10、CPU 视图(CPU views)

(1)JProfiler 提供不同的方法,记录访问树以优化性能和细节

(2)所有视图可以选择线程 / 线程组 / 线程状况

(3)所有视图都可以聚集到方法、类、包、J2EE 组件等不同层上

(4)访问树 Call Tree:显示一个积累的自顶向下的树,树中包含所有在 JVM 中已记录的访问队列,JDBC、JMS、JNDI 服务请求都被注释在请求树中,请求树可以根据 Servlet、JSP 对 URL 的不同需要进行拆分

(5)热点 Hot Spots:显示消耗时间最多的方法的列表,对每个热点都能够显示回溯树,该热点可以按照方法请求、JDBC、JMS、JNDI 服务请求、URL 请求计算

(6)访问图 Call Graph:显示一个从已选方法、类、包、J2EE 组件开始的访问队列的图

(7)方法统计 Method Statistis:显示一段时间内记录的方法的调用时间细节

11、线程视图(Threads)

(1)JProfiler 通过对线程历史的监控,判断其运行状态,并监控是否有线程阻塞产生,将一个线程所管理的方法以树状形式呈现,对线程剖析

(2)线程历史 Thread History:显示一个与线程活动、线程状态在一起的活动时间表

(3)线程监控 Thread Monitor:显示一个列表,包括所有活动线程及其目前的活动状况

(4)线程转储 Thread Dumps:显示所有线程的堆栈跟踪

(5)线程分析关注三个方面:Web 容器的线程最大数、线程阻塞、线程死锁

12、监控和锁(Monitors & Locks)

(1)所有线程持有锁的情况以及锁的信息

(2)观察 JVM 的内部线程并查看状态

(3)死锁探测图表 Current Locking Graph:显示 JVM 中的当前死锁图表

(4)目前使用的监测器 Current Monitors:显示目前使用的监测器,且包括其关联线程

(5)锁定历史图表 Locking History Graph:显示记录在 JVM 中的锁定历史

(6)历史检测记录 Monitor History:显示重大的等待事件、阻塞事件的历史记录

(7)监控器使用统计 Monitor Usage Statistics:显示分组监测,线程、类的统计监测数据

 

Arthas

1、上述工具都必须在服务端项目进程中,配置相关的监控参数,然后工具通过远程连接到项目进程,获取相关的数据

2、Arthas 不需要远程连接,也不需要配置监控参数,同时提供丰富的性能监控数据

(1)Alibaba 开源 Java 诊断工具

(2)优点:在线排查问题,无需重启;动态跟踪 Java 代码;实时监控 JVM 状态

(3)Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,提供 Tab 自动补全功能,方便进行问题的定位和诊断

(4)Arthas 只是一个 Java 程序,可以直接使用 java -jar 运行

(5)除命令行查看外,支持 Web Console,在成功启动连接进程后,就已经自动启动,通过 http://127.0.0.1:8563/ 访问,页面上的操作模式和控制台完全一样

3、基础指令

quit/exit 退出当前 Arthas客户端,其他 Arthas喜户端不受影响
stop/shutdown 关闭 Arthas服务端,所有 Arthas客户端全部退出
help 查看命令帮助信息
cat 打印文件内容,和linux里的cat命令类似
echo 打印参数,和linux里的echo命令类似
grep 匹配查找,和linux里的gep命令类似
tee 复制标隹输入到标准输出和指定的文件,和linux里的tee命令类似
pwd 返回当前的工作目录,和linux命令类似
cls 清空当前屏幕区域
session 查看当前会话的信息
reset 重置增强类,将被 Arthas增强过的类全部还原, Arthas服务端关闭时会重置所有增强过的类
version 输出当前目标Java进程所加载的 Arthas版本号
history 打印命令历史
keymap Arthas快捷键列表及自定义快捷键

4、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功能

5、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

6、monitor / watch / trace 相关

monitor 方法执行监控,调用次数、执行时间、失败率
	-c 统计周期,默认值为120秒
watch 方法执行观测,能观察到的范围为:返回值、抛出异常、入参,通过编写groovy表达式进行对应变量的查看
	-b 在方法调用之前观察(默认关闭)
	-e 在方法异常之后观察(默认关闭)
	-s 在方法返回之后观察(默认关闭)
	-f 在方法结束之后(正常返回和异常返回)观察(默认开启)
	-x 指定输岀结果的属性遍历深度,默认为0
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
	-n 执行次数限制
stack 输出当前方法被调用的调用路径
tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

7、其他

jobs 列出所有job
kill 强制终止任务
fg 将暂停的任务拉到前台执行
bg 将暂停的任务放到后台执行
grep 搜索满足条件的结果
plaintext 将命令的结果去除ANSI颜色
wc 按行统计输出结果
options 查看或设置Arthas全局开关
profiler 使用async-profiler对应用采样,生成火焰图

 

Java Misssion Control

1、对 Java 应用程序进行管理、监视、概要分析、故障排除的工具套件

(1)一个 GUI 客户端,众多收集 Java 虚拟机性能数据的插件

(2)JMX Console:能够访问用来存放虚拟机各个子系统运行数据的 MXBeans

(3)虚拟机内置的高效 profiling 工具:Java Flight Recorder(JFR)

2、优点:采用取样,不是传统的代码植入技术,对应用性能的影响小

 

Java Flight Recorder

1、JMC 其中一个组件

2、Java 11 开始,JFR 己经开源,但旧版本,JFR 属于 Commercial Feature 通过 Java 虚拟机参数 -XX:+UnlockCommercialFeatures 开启

3、以极低的性能开销,收集 Java 虚拟机的性能数据

(1)与其他工具相比,JFR 性能开销很小,在默认配置下平均低于 1%

(2)JFR 能够直接访问虚拟机内的数据,且不会影响虚拟机的优化,因此适用于生产环境下满负荷运行 Java 程序

4、Java Flight Recorder、JDK Mission Control 共同创建一个完整的工具链

(1)JDK Mission Control 可对 Java Flight Recorder 连续收集低水平、详细的运行时信息,进行高效、详细的分析

(2)启用 JFR 时,将记录运行过程中发生的一系列事件,其中包括 Java 层面的事件,如:线程事件、锁事件、Java 虚拟机内部的事件,如:新建对象,垃圾回收、即时编译事件

5、按照发生时机、持续时间分类,JFR 共 4 种类型事件

(1)瞬时事件(Instant Event):用户关心它们发生与否,如:异常、线程启动事件

(2)持续事件(Duration Event):用户关心它们的持续时间,如:垃圾回收事件

(3)计时事件(Timed Event):时长超出指定阈值的持续事件

(4)取样事件(Sample Event):周期性取样的事件

(5)取样事件常见例子:方法抽样(Method Sampling):每隔一段时间统计各个线程的栈轨迹,如果在抽样取得的栈轨迹中,存在一个反复出现的方法,则可以推测该方法为热点方法

 

火焰图(Flame Graphs)

1、直观展示 CPU 在程序整个生命周期过程中的时间分配

2、显示出调用栈中的 CPU 消耗瓶颈

(1)X 轴:度量时间指标

(2)Y 轴:线程栈的层次

 

Btrace

1、常用动态追踪工具:BTrace、HouseHD(停止开发)、Greys-Anatomy(个人开发)、Byteman(JBoss 开发)

2、BTrace 是 SUN Kenai 云计算开发平台下的一个开源项目,目的是 Java 提供安全可靠的动态跟踪分析工具

3、动态地追踪一个运行的 Java 程序,BTrace 动态调整目标应用程序的类,以注入跟踪代码(字节码跟踪)

posted @   半条咸鱼  阅读(364)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示