Skip to content

如何排查生产问题?

排查工具

JDK 工具

官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/

image-20220328171810444

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
jstat -gcutil 6 5000 100

image-20230619171154690

参数:

  • 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 pid
jstack排查线上cpu100%
  1. top命令找到最耗cpu的进程
  2. top -Hp 进程id 找到最耗cpu的线程
  3. jstack pid 查看线程堆栈
  4. 定位代码

Arthas

官方文档:https://arthas.aliyun.com/doc/commands.html

arthas idea pluginhttps://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 -nthread -n 8查看最繁忙的8个线程在执行的线程栈
jadjad com.open.Application反编译 Application.class
watchwatch com.open.order.HighCPUApplication doTask '{params}' '#cost>100' -x 2监控耗时超过 100 毫秒的 doTask 方法的入参,并且输出入参,展开 2 层入参参数
ArthasHotSwap热部署

MAT

官方文档:https://www.eclipse.org/mat/

排查 OOM 问题、分析程序堆内存使用情况,分析堆转储(包含了堆现场全貌和线程栈信息)。

  1. 通过支配树功能或直方图功能查看消耗内存最大的类型,来分析内存泄露的大概原因;
  2. 查看那些消耗内存最大的类型、详细的对象明细列表,以及它们的引用链,来定位内存泄露的具体点;
  3. 配合查看对象属性的功能,可以脱离源码看到对象的各种属性的值和依赖关系,帮助我们理清程序逻辑和参数;
  4. 辅助使用查看线程栈来看 OOM 问题是否和过多线程有关,甚至可以在线程栈看到 OOM 最后一刻出现异常的线程。

image-20220727115946296

image-20220727120007646

参考文档

使用MAT定位OOM异常代码

工作六年,我学会了用 Arthas 来辅助我的日常工作

通过 Arthas Trace 命令将接口性能优化十倍

Arthas 日常记录