史上最全图解 JVM,京东小哥带你了解性能提升 100% 背后的秘密武器
特点:
使用方便、界面操作友好(简单且强大)
对被分析的应用影响小(提供模板)
CPU,Thread,Memory 分析功能尤其强大
支持对 jdbc,noSql,jsp,servlet,socket 等进行分析
支持多种模式(离线,在线)的分析
支持监控本地、远程的 JVM
跨平台,拥有多种操作系统的安装版本
主要功能:
1-方法调用:对方法调用的分析可以帮助您了解应用程序正在做什么,并找到提高其性能的方法。
2-内存分配:通过分析堆上对象、引用链和垃圾收集能帮您修复内存泄露问题,优化内存使用。
3-线程和锁:JProfiler 提供多种针对线程和锁的分析视图助您发现多线程问题。
4-高级子系统:许多性能问题都发生在更高的语义级别上。例如,对于 JDBC 调用,您可能希望找出执行最慢的 SQL 语句。JProfiler 支持对这些子系统进行集成分析。
数据采集方式:
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:类跟踪视图可以包含任意数量的图表,显示选定的类和包的实例与时间。
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:显示分组监测,线程和监测类的统计监测数据。
Arthas
======
上述工具都必须在服务端项目进程中配置相关的监控参数,然后工具通过远程连接到项目进程,获取相关的数据。这样就会带来一些不便,比如线上环境的网络是隔离的,本地的监控工具根本连不上线上环境。并且类似于 Jprofiler 这样的商业工具,是需要付费的。
那么有没有一款工具不需要远程连接,也不需要配置监控参数,同时也提供了丰富的性能监控数据呢?
阿里巴巴开源的性能分析神器 Arthas 应运而生。
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪 Java 代码;实时监控 JVM 状态。Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我们 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到 JVM 的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
安装方式:如果速度较慢,可以尝试国内的码云 Gitee 下载。
* 1`wget https://io/arthas/arthas-boot.jar
* 2wget 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 强制终止任 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 务
fg 将暂停的任务拉到前台执行
bg 将暂停的任务放到后台执行
grep 搜索满足条件的结果
plaintext 将命令的结果去除 ANSI 颜色
wc 按行统计输出结果
options 查看或设置 Arthas 全局开关
profiler 使用 async-profiler 对应用采样,生成火焰图
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)。
评论