如何排查生产问题?
排查工具
JDK 工具
jvisualvm
继续观察监视面板可以看到,JVM 的 GC 活动基本是 10 秒发生一次,堆内存在 250MB 到 900MB 之间波动,活动线程数是 22。我们可以在监视面板看到 JVM 的基本情况,也可以直接在这里进行手动 GC 和堆 Dump 操作:
jconsole如果希望看到各个内存区的 GC 曲线图,可以使用 jconsole 观察。jconsole 也是一个综合性图形界面监控工具,比 jvisualvm 更方便的一点是,可以用曲线的形式监控各种数据,包括 MBean 中的属性值:
jstat
jstat 工具允许以固定的监控频次输出 JVM 的各种监控指标
比如使用 -gcutil 输出 GC 和内存占用汇总信息,每隔 5 秒输出一次,输出 100 次
jstat -gcutil 6 5000 100
参数:
- S0 Survivor0 区占用百分比
- S1 Survivor1 区占用百分比
- E Eden 区占用百分比
- O 老年代占用百分比
- M 元数据区占用百分比
- CCS 压缩使用百分比
- YGC 年轻代回收次数
- YGCT 年轻代回收耗时(单位秒)
- FGC 老年代回收次数
- FGCT 老年代回收耗时(单位秒)
- GCT 垃圾回收消耗总时间(单位秒)
jstat排查线上内存泄漏
1.TOP FREE DF
命令
2.jstat -gc pid [interval]
命令 查看 java 进程的 GC 状态,排查FGC值
jstat [-options] pid interval
-class 查看类加载信息
-compile 编译统计信息
-gc 垃圾回收信息
-gcXXX 各区域 GC 的详细信息 如 -gcold
3.使用 jstack pid > jstack.log
保存线程栈现场,使用 jmap -dump:format=b,file=heap.log pid
保存堆现场
4.分析栈 grep 'java.lang.Thread.State' jstack.log | wc -l
查看线程数
5.下载堆 dump 文件 gzip
设置推荐使用 6~7下载压缩文件,将文件后缀改为 .hprof
,使用 MAT 分析 jvm heap,选择 memory leak suspect
jstack
通过命令行工具 jstack,实现抓取线程栈的操作
jstack pid
jstack排查线上cpu100%
- top命令找到最耗cpu的进程
- top -Hp 进程id 找到最耗cpu的线程
- jstack pid 查看线程堆栈
- 定位代码
Arthas
官方文档:https://arthas.aliyun.com/doc/commands.html
arthas idea plugin:https://www.yuque.com/docs/share/fa77c7b4-c016-4de6-9fa3-58ef25a97948
1.提供性能看板,包括线程、cpu、内存等信息,并且会定时的刷新。
2.根据各种条件查看线程快照。找出cpu占用率最高的n个线程
3.输出jvm的各种信息,如gc算法、jdk版本、ClassPath等
4.遇到问题无法在线上 debug,热部署加日志直接替换
5.查看某个类的静态属性,也可以通过ognl语法执行一些语句
6.查看已加载的类的详细信息,这个类从哪个jar包加载的,查看类的方法的信息
7.dump 类的字节码到指定目录
8.直接反编译指定的类
9.快速定位应用的热点,生成火焰图
10.可以监控到JVM的实时运行状态
命令 | 示例 | 作用 |
---|---|---|
dashboard | 用于整体展示进程所有线程、内存、GC 等情况 | |
thread -n | thread -n 8 | 查看最繁忙的8个线程在执行的线程栈 |
jad | jad com.open.Application | 反编译 Application.class |
watch | watch com.open.order.HighCPUApplication doTask '{params}' '#cost>100' -x 2 | 监控耗时超过 100 毫秒的 doTask 方法的入参,并且输出入参,展开 2 层入参参数 |
ArthasHotSwap | 热部署 |
MAT
排查 OOM 问题、分析程序堆内存使用情况,分析堆转储(包含了堆现场全貌和线程栈信息)。
- 通过支配树功能或直方图功能查看消耗内存最大的类型,来分析内存泄露的大概原因;
- 查看那些消耗内存最大的类型、详细的对象明细列表,以及它们的引用链,来定位内存泄露的具体点;
- 配合查看对象属性的功能,可以脱离源码看到对象的各种属性的值和依赖关系,帮助我们理清程序逻辑和参数;
- 辅助使用查看线程栈来看 OOM 问题是否和过多线程有关,甚至可以在线程栈看到 OOM 最后一刻出现异常的线程。