写点什么

史上最全图解 JVM,京东小哥带你了解性能提升 100% 背后的秘密武器

  • 2022 年 5 月 16 日
  • 本文字数:4367 字

    阅读完需:约 14 分钟

特点:


  • 使用方便、界面操作友好(简单且强大)

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

  • 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)。

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
史上最全图解JVM,京东小哥带你了解性能提升100%背后的秘密武器_Java_爱好编程进阶_InfoQ写作社区