1. JDK自带的命令行工具
2.JDK自带的可视化工具
1.jconsole
- 启动:双击jdk/bin/jconsole.exe
- 选择要诊断的进程,建立连接
- “概述”页签显示的是整个虚拟机主要运行数据的概览,其中包括“堆内存使用情况”、“线程”、“类”、“CPU使用情况”4种信息的曲线图,这些曲线图的后面“内存”、“线程”、“类”页签的信息汇总。
- 内存监控(“内存”页签) 相当于可视化的jstat命令,可查看不同内群不同分区使用量,可手动执行GC
- 线程监控,相当于可视化的jstack命令,可查看每个线程的状态、堆栈、阻塞总数(线程处于BLOCKED的次数)、等待总数(线程处于WAITING或TIMED_WAITING的次数),可检测死锁
2. jvisualvm
功能(可按需下载插件):
- 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)
- 监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)
- dump以及分析堆转储快照(jmap、jhat)
- 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法
- 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
- 其他插件的无限可能
使用:
- 启动:双击jdk/bin/jvisualvm.exe
- 按需选择安装插件(工具-插件)
- 选择进程
- 生成、浏览堆转储快照
- 方式一:右键单击应用程序节点,选择“堆Dump”,生成堆转储快照
- 方式二:双击应用程序节点以打开应用程序标签,然后在“监视”标签中单击“堆Dump”
- thread dump
3. Arthas(阿尔萨斯)
1. 介绍
arthas-boot是arthas的启动程序,可以通过命令java -jar arthas-boot.jar --target-ip 0.0.0.0来启动arthas,启动后,会列出所有的java进程,通过输入进程序号并回车来选择想要诊断的进程。
选择好进程后,可通过以下命令来诊断
2. 使用
- 启动
(在jar包所在文件夹下执行)java -jar arthas-boot.jar
选择要诊断的进程
可访问给定ip+端口在网页中操作。 端口3658、8563都可以(但网页中不如命令行窗口流畅……) - 使用1)中的命令进行诊断
4.诊断实例
1.死锁
- 使用arthas
执行jvm命令可看到当前死锁的线程数
thread -b(找出当前阻塞其他线程的线程)命令执行结果
下图含义:Thread-0在尝试锁@7480cele对象时阻塞了,这个对象的锁被Thread-1持有。Thread-0锁了对象@7d8daac1,但这个对象锁被持有,也导致了另一个线程被阻塞。
![在这里插入图片描述]()
通过thread --state BLOCKED可以看到哪些线程被阻塞
- 使用jstack
执行命令:jstack -l pid 或者 jstack pid,执行该命令会打印full dump。结果中的部分内容如下,可以看到线程1和线程0发生死锁 - jconsole
- jvisualvm
生成线程dump:
2. cpu消耗大
- arthas
执行thread命令(结果默认按cpu消耗大小来排序)
可以看到ID为12的线程耗费了100%的cpu。
通过命令thread [ID]可以查看指定线程的堆栈
通过分析线程堆栈即可得知是什么操作、哪个方法消耗了cpu。上图例就是在Arthas的cpuHigh()
- jstack
在linux中,可使用top命令和shift+h获得占cpu高的进程和线程,并用jstack [pid]来分析对应的线程。
在windows中,可通过任务管理器查看占cpu高的进程,但查看线程需借助别的工具。
3. 反编译
arthas
可通过jad [class]来反编译指定类,用来判断当前执行的代码是否是自己想要执行的代码。
4. trace
arthas
通过trace [class] [method]来跟踪统计方法耗时,可用于查出具体是哪个方法耗时久