“这是我参与更文挑战的第6天,活动详情查看: 更文挑战”
上篇介绍了Java中的内存泄漏与内存溢出,接下来介绍JVM监控及诊断工具-GUI下篇。
一、JProfiler
基本概述
介绍
- 在运行Java的时候有时候想测试运行时占用内存情况,这时候就需要使用测试工具查看了。在Eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在IDEA中也有这么一个插件,就是JProfiler。
- JProfiler是由ej-technologies公司开发的一款Java应用性能诊断工具。功能强大,但是收费。
- 官方下载地址:www.ej-technologies.com/products/jp…
主要功能
方法调用
对方法调用的分析可以帮助您了解应用程序正在做什么,并找到提高其性能的方法
内存分配
通过分析堆上对象、引用链和垃圾收集能帮您修复内存泄漏问题,优化内存使用
线程和锁
JProfiler提供多种针对线程和锁的分析视图助您发现多线程问题
高级子系统
许多性能问题都发生在更高的语义级别上。例如,对于JDBC调用,您可能希望找出执行最慢的SQL语句。JProfiler支持对这些子系统进行集成分析
安装与配置
下载与安装
下载:www.ej-technologies.com/download/jp…
JProfiler中配置IDEA
IDEA集成JProfiler
具体使用
数据采集方式
JProfiler数据采集方式分为两种:Sampling(样本采集)和Instrumentation(重构模式)
Instrumentation:这是JProfiler全功能模式。在class加载之前,JProfiler把相关功能代码写入到需求分析的class的bytecode中,对正在运行的jvm有一定影响。
- 优点:功能强大。在此设置中,调用堆栈信息是准确的。
- 缺点:若要分析的class较多,则对应用的性能影响较大,cpu开销可能很高(取决于Filter的控制)。因此使用此模式一般配合Filter使用,只对特定的类或包进行分析。
Sampling:类似于样本统计,每隔一定时间(5ms)将每个线程栈中方法栈中的信息统计出来。
- 优点:对CPU的开销非常低,对应用影响小(即使你不配置任何Filter)
- 缺点:一些数据/特性不能提供(例如:方法的调用次数、执行时间)
注:JProfiler本身没有指出数据的采集类型,这里的采集类型是针对方法调用的采集类型。因为JProfiler的绝大多数核心功能都依赖方法调用采集的数据,所以可以直接认为是JProfiler的数据采集类型。
遥感监测 Telemetries
内存视图 Live Memory
堆遍历 heap walker
cpu视图 cpu views
线程视图 threads
JProfiler通过对线程历史的监控判断其运行状态,并监控是否有线程阻塞产生,还能将一个线程所管理的方法以树状形式呈现。对线程剖析。
线程历史 Thread History 显示一个与线程活动和线程状态在一起的活动时间表。
线程监控 Thread Monitor 显示一个列表,包括所有的活动线程以及它们目前的活动状态。
线程转储 Thread Dumps 显示所有线程的堆栈跟踪。
线程分析主要关心三个方面:
- web容器的线程最大数。比如:Tomcat的线程容量应该略大于最大并发数。
- 线程阻塞
- 线程死锁
监视器&锁 Monitors&locks
监控和锁 Monitors & Locks 所有线程持有锁的情况以及锁的信息。 观察JVM的内部线程并查看状态:
- 死锁探索图标 Current Locking Graph:显示JVM中的当前死锁图表。
- 目前使用的监视器 Current Monitors:显示目前使用的监视器并且包括它们的关联线程。
- 锁定历史图表 Locking History Graph:显示记录在JVM中的锁定历史。
- 历史检测记录 Monitor History:显示重大的等待事件和阻塞事件的历史记录。
- 监控器使用统计 Monitor Usage Statistics:显示分组监测,线程和监测类的统计监测数据
二、Arthas
基本概述
背景
前面,我们介绍了jdk自带的jvisualvm等免费工具,以及商业化工具JProfiler。 JVisualVM、JProfiler这两款工具在业界知名度也比较高,他们的优点是可以通过图形界面上看到各维度的性能数据,使用者根据这些数据进行综合分析,然后判断哪里出现了性能问题。
但是这两款工具也有个缺点,都必须在服务端项目进程中配置相关的监控参数。然后工具通过远程连接到项目进程,获取相关的数据。这样就会带来一些不便,比如线上环境的网络是隔离的,本地的监控工具根本连不上线上环境。并且类似于JProfiler这样的商业工具,是需要付费的。
那么有没有一款工具不需要远程连接,也不需要配置监控参数,同时也提供了丰富的性能监控数据呢? 今天跟大家介绍一款阿里巴巴开源的性能分析神奇Arthas(阿尔萨斯)
概述
Arthas(阿尔萨斯)是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。
Arthas支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个jar包加载的?为什么会报各种类相关的Exception?
- 我改的代码为什么没有执行到?难道是我没commit?分支搞错了?
- 遇到问题无法在线上debug,难道只能通过加日志再重新发布嘛?
- 线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现!
- 是否有一个全局视觉来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
基于哪些工具开发而来
- reys-anatomy:Arthas代码基于Greys二次开发而来,非常感谢Greys之前所有的工作,以及Greys原作者对Arthas提出的意见与建议!
- termd:Arthas的命令实现基于termd开发,是一款优秀的命令程序开发框架,感觉termd提供了优秀的框架。
- crash:Arthas的文本渲染功能基于crash中的文本渲染功能开发,可以从这里看到源码,感谢crash在这方面所做的优秀工作。
- cli:Arthas的命令行界面基于vert.x提供的cli库进行开发,感谢vert.x在这方面做的优秀的工作。
- compiler Arthas里的内存编译器代码来源
- Apache Commons Net Arthas里的Telnet Client代码来源
- JavaAgent:运行在main方法之前的拦截器,它内定的方法名叫premain,也就是说先执行premain方法,然后在执行main方法。
- SM:一个通用的Java字节码操作和分析框架。它可以用于修改现有的类或直接以二进制形式动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以从它们构建定制的复杂转换和代码分析工具。ASM提供了与其它Java字节码框架类似的功能,但是主要关注性能。因为它被设计和实现得尽可能小和快,所以非常适合在动态系统中使用(当然也可以以静态方式使用,例如在编译器中 v)
官方使用文档
安装与使用
安装
安装方式一:可以直接在Linux上通过命令下载,可以在官方Github上进行下载,如果速度较慢,可以尝试国内的码云Gitee下载。
- github下载 wget alibaba.github.io/arthas/arth…
- Gitee下载 wget arthas.gitee.io/arthas-boot…
安装方式二: 也可以在浏览器直接访问alibaba.github.io/arthas/arth…
卸载
在Linux/Unix/Mac平台
删除下面文件:
rm -rf ~/.arthas/
rm -rf ~/logs/arthas
Windows平台直接删除user home下面的.arthas和logs/arthas目录
工程目录
arthas-agent:基于JavaAgent技术的代理
bin:一些启动脚本
arthas-boot:Java版本的一键安装启动脚本
arthas-client:telnet client代码
arthas-common:一些共用的工具类和枚举类
arthas-core:核心类,各种arthas命令的交互和实现
arthas-demo:示例代码
arthas-memorycompiler:内存编译器代码,Fork from github.com/skalogs/Ska…
arthas-packaging:maven打包相关的
arthas-site:arthas站点
arthas-spy:编织到目标类中的各个切面
static:静态资源
arthas-testcase:测试
启动
Arthas只是一个Java程序,所以可以直接用java -jar运行。
执行成功后,arthas提供了一种命令行方式的交互方式,arthas会检测当前服务器上的Java进程,并将进程列表展示出来,用户输入对应的编号(1、2、3、4...)进行选择,然后回车。
方式1:java -jar arthas-boot.jar
选择进程(输入[]内编号(不是PID)回车)
[INFO] arthas-boot version: 3.1.4
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 11616 com.Arthas
[2]: 8676
[3]: 16200 org.jetbrains.jps.cmdline.Launcher
[4]: 21032 org.jetbraiins.idea.maven.server.RemoteMavenServer
方式2:运行时选择Java进程PID
java -jar arthas-boot.jar [PID]
查看进程
查看日志
cat ~/logs/arthas/arthas.log
参看帮助
java -jar arthas-boot.jar -h
web console
退出
相关诊断指令
基础指令
jvm相关
class/classloader相关
monitor/watch/trace相关
其它
三、Java Mission Control
历史
概述
功能:实时监控JVM运行时的状态
四、其他工具
Flame Graphs(火焰图)
火焰图,简单通过x轴横条宽度来度量时间指标,y轴代表线程栈的层次。
Tprofiler
TProfiler配置部署、远程操作、日志阅读都不太复杂,操作还是很简单的。但是其却是能够起到一针见血、立竿见影的效果,帮助我们解决了GC过于频繁的性能瓶颈。
TProfiler最重要的特性就是能够统计出你指定时间内JVM的top method,这些top method极有可能就是造成你JVM性能瓶颈的元凶。这是其他大多数JVM调优工具所不具备的,包括JRockit Mission Control。JRokit首席开发者Marcus Hirt在其私人博客《Low Overhead Method Profiling with Java Mission Control》下的评论中曾明确指出JRMC并不支持TOP方法的统计。
TProfiler的下载: github.com/alibaba/TPr…
总结
本章介绍了JVM监控及诊断工具GUI下篇,包括JProfiler、Arthas、Java Mission Controll等的使用。下一篇介绍JVM运行时参数。
欢迎大家关注公众号(MarkZoe)互相学习、互相交流。