JVM监控及诊断工具-GUI下篇

1,116 阅读9分钟

“这是我参与更文挑战的第6天,活动详情查看: 更文挑战

上篇介绍了Java中的内存泄漏与内存溢出,接下来介绍JVM监控及诊断工具-GUI下篇。

一、JProfiler

基本概述

介绍

  1. 在运行Java的时候有时候想测试运行时占用内存情况,这时候就需要使用测试工具查看了。在Eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在IDEA中也有这么一个插件,就是JProfiler。
  2. JProfiler是由ej-technologies公司开发的一款Java应用性能诊断工具。功能强大,但是收费。
  3. 官方下载地址: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有一定影响。

  1. 优点:功能强大。在此设置中,调用堆栈信息是准确的。
  2. 缺点:若要分析的class较多,则对应用的性能影响较大,cpu开销可能很高(取决于Filter的控制)。因此使用此模式一般配合Filter使用,只对特定的类或包进行分析。

Sampling:类似于样本统计,每隔一定时间(5ms)将每个线程栈中方法栈中的信息统计出来。

  1. 优点:对CPU的开销非常低,对应用影响小(即使你不配置任何Filter)
  2. 缺点:一些数据/特性不能提供(例如:方法的调用次数、执行时间)

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

遥感监测 Telemetries

内存视图 Live Memory

堆遍历 heap walker

cpu视图 cpu views

线程视图 threads

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

线程历史 Thread History 显示一个与线程活动和线程状态在一起的活动时间表。

线程监控 Thread Monitor 显示一个列表,包括所有的活动线程以及它们目前的活动状态。

线程转储 Thread Dumps 显示所有线程的堆栈跟踪。

线程分析主要关心三个方面:

  1. web容器的线程最大数。比如:Tomcat的线程容量应该略大于最大并发数。
  2. 线程阻塞
  3. 线程死锁

监视器&锁 Monitors&locks

监控和锁 Monitors & Locks 所有线程持有锁的情况以及锁的信息。 观察JVM的内部线程并查看状态:

  1. 死锁探索图标 Current Locking Graph:显示JVM中的当前死锁图表。
  2. 目前使用的监视器 Current Monitors:显示目前使用的监视器并且包括它们的关联线程。
  3. 锁定历史图表 Locking History Graph:显示记录在JVM中的锁定历史。
  4. 历史检测记录 Monitor History:显示重大的等待事件和阻塞事件的历史记录。
  5. 监控器使用统计 Monitor Usage Statistics:显示分组监测,线程和监测类的统计监测数据

二、Arthas

基本概述

背景

前面,我们介绍了jdk自带的jvisualvm等免费工具,以及商业化工具JProfiler。 JVisualVM、JProfiler这两款工具在业界知名度也比较高,他们的优点是可以通过图形界面上看到各维度的性能数据,使用者根据这些数据进行综合分析,然后判断哪里出现了性能问题。

但是这两款工具也有个缺点,都必须在服务端项目进程中配置相关的监控参数。然后工具通过远程连接到项目进程,获取相关的数据。这样就会带来一些不便,比如线上环境的网络是隔离的,本地的监控工具根本连不上线上环境。并且类似于JProfiler这样的商业工具,是需要付费的。

那么有没有一款工具不需要远程连接,也不需要配置监控参数,同时也提供了丰富的性能监控数据呢? 今天跟大家介绍一款阿里巴巴开源的性能分析神奇Arthas(阿尔萨斯)

概述

Arthas(阿尔萨斯)是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。

Arthas支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个jar包加载的?为什么会报各种类相关的Exception?
  2. 我改的代码为什么没有执行到?难道是我没commit?分支搞错了?
  3. 遇到问题无法在线上debug,难道只能通过加日志再重新发布嘛?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现!
  5. 是否有一个全局视觉来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?

基于哪些工具开发而来

  1. reys-anatomy:Arthas代码基于Greys二次开发而来,非常感谢Greys之前所有的工作,以及Greys原作者对Arthas提出的意见与建议!
  2. termd:Arthas的命令实现基于termd开发,是一款优秀的命令程序开发框架,感觉termd提供了优秀的框架。
  3. crash:Arthas的文本渲染功能基于crash中的文本渲染功能开发,可以从这里看到源码,感谢crash在这方面所做的优秀工作。
  4. cli:Arthas的命令行界面基于vert.x提供的cli库进行开发,感谢vert.x在这方面做的优秀的工作。
  5. compiler Arthas里的内存编译器代码来源
  6. Apache Commons Net Arthas里的Telnet Client代码来源
  7. JavaAgent:运行在main方法之前的拦截器,它内定的方法名叫premain,也就是说先执行premain方法,然后在执行main方法。
  8. SM:一个通用的Java字节码操作和分析框架。它可以用于修改现有的类或直接以二进制形式动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以从它们构建定制的复杂转换和代码分析工具。ASM提供了与其它Java字节码框架类似的功能,但是主要关注性能。因为它被设计和实现得尽可能小和快,所以非常适合在动态系统中使用(当然也可以以静态方式使用,例如在编译器中 v)

官方使用文档

arthas.aliyun.com/zh-cn/

安装与使用

安装

安装方式一:可以直接在Linux上通过命令下载,可以在官方Github上进行下载,如果速度较慢,可以尝试国内的码云Gitee下载。

  1. github下载 wget alibaba.github.io/arthas/arth…
  2. 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

退出

相关诊断指令

基础指令

image.png

jvm相关

image.png

class/classloader相关

image.png

monitor/watch/trace相关

image.png

其它

image.png

三、Java Mission Control

历史

image.png

概述

image.png

功能:实时监控JVM运行时的状态

image.png

四、其他工具

Flame Graphs(火焰图)

火焰图,简单通过x轴横条宽度来度量时间指标,y轴代表线程栈的层次。

image.png

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)互相学习、互相交流。