标签搜索

线上JVM问题排查常用方法

wangpig
2023-07-10 / 0 评论 / 108 阅读 / 正在检测是否收录...

线上JVM问题排查常用方法

jps

  • jps -l 打印java进程的进程号、对应的jar包或命令
  • jps -v 打印java进程的进程号、启动的详细命令、参数

jstat

  • jstat -options 查看可选参数

    -class
    -compiler
    -gc
    -gccapacity
    -gccause
    -gcmetacapacity
    -gcnew
    -gcnewcapacity
    -gcold
    -gcoldcapacity
    -gcutil
    -printcompilation
  • class 打印类加载信息

    C:\Users\18919>jstat -class 61160 100 5
    Loaded  Bytes  Unloaded  Bytes     Time
     87286 177563.7     3141  4347.7      53.62
     87286 177563.7     3141  4347.7      53.62
     87286 177563.7     3141  4347.7      53.62
     87286 177563.7     3141  4347.7      53.62
     87286 177563.7     3141  4347.7      53.62
  • gc 打印gc信息,主要查看FGC相关属性是否正常

    C:\Users\18919>jstat -gc 61160 100 5
    S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
    0.0   2048.0  0.0   1230.4 634880.0 45056.0   544768.0   403678.5  524864.0 519870.3 68352.0 66078.1    183    1.970   0      0.000  106     2.050    4.020
    0.0   2048.0  0.0   1230.4 634880.0 45056.0   544768.0   403678.5  524864.0 519870.3 68352.0 66078.1    183    1.970   0      0.000  106     2.050    4.020
    0.0   2048.0  0.0   1230.4 634880.0 45056.0   544768.0   403678.5  524864.0 519870.3 68352.0 66078.1    183    1.970   0      0.000  106     2.050    4.020
    0.0   2048.0  0.0   1230.4 634880.0 45056.0   544768.0   403678.5  524864.0 519870.3 68352.0 66078.1    183    1.970   0      0.000  106     2.050    4.020
    0.0   2048.0  0.0   1230.4 634880.0 45056.0   544768.0   403678.5  524864.0 519870.3 68352.0 66078.1    183    1.970   0      0.000  106     2.050    4.020

jstack

  • jstack

    C:\Users\18919>jstack 61160
    2023-07-10 14:03:11
    Full thread dump OpenJDK 64-Bit Server VM (17.0.7+10-b829.16 mixed mode):
    
    Threads class SMR info:
    _java_thread_list=0x00000291ac179d80, length=73, elements={
    0x00000290c39b4fb0, 0x00000290ef87e850, 0x00000290ef8a7cb0, 0x00000290ef8df530,
    0x00000291c1427c70, 0x00000291b3e53e00, 0x00000291a311a6a0, 0x00000291cd92f250,
    0x00000291a3119830
    }
    
    "main" #1 prio=5 os_prio=0 cpu=1625.00ms elapsed=91669.62s tid=0x00000290c39b4fb0 nid=0xee14 waiting on condition  [0x000000da51d6e000]
    java.lang.Thread.State: TIMED_WAITING (parking)
    at jdk.internal.misc.Unsafe.park(java.base@17.0.7/Native Method)
    - parking to wait for  <0x0000000081c81338> (a kotlinx.coroutines.BlockingCoroutine)
    at java.util.concurrent.locks.LockSupport.parkNanos(java.base@17.0.7/LockSupport.java:252)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:88)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
    at com.intellij.idea.Main.main(Main.kt:40)
    
    "Signal Dispatcher" #4 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=91669.59s tid=0x00000290ef8df530 nid=0xea78 waiting on condition  [0x0000000000000000]
    java.lang.Thread.State: RUNNABLE
    ...
    "Attach Listener" #5 daemon prio=5 os_prio=2 cpu=0.00ms elapsed=91669.59s tid=0x00000290ef8dfff0 nid=0xf2ac waiting on condition  [0x0000000000000000]
    java.lang.Thread.State: RUNNABLE
  • jstack pid | grep deadlock 主要用来排查是否存在死锁

top

  • top -H -p [pid] 查看进程中具体是那一条线程的CPU利用率高
  • printf '%x\n' [tid] 将10进制转成16进制
  • jstack pid | grep tid(16进制) 搜索出该线程。vi打开搜索看的更全。

jmap

  • jmap -dump:live,format=b,file=heap.hprof pid 生成heap.hprof堆快照文件,可下载用mat打开
  • jmap -histo:live pid | head -20 打印线程存活对象信息。(非基础类的数量多可能就会是存在问题的类)

jhat

  • jhat <heap.hprof文件路径> 解析堆快照,会启动一个web应用,在浏览器可分析(简陋)
    以包为分类,展示每个类

    • ip:port/showInstanceCounts 从大到小按类实例的数量进行展示
    • ip:port/histo 从大到小按占用字节数进行展示
    • ip:port/oql 执行oql表达式的界面

      SELECT obj FROM java.lang.Object obj WHERE obj.name = 'example'

      SELECT obj FROM java.lang.Object obj ORDER BY obj.timestamp DESC

      SELECT COUNT(obj) FROM java.lang.Object obj

jinfo

  • jinfo pid 打印java系统参数、vm标记、vm参数

arthas

arthas 是阿里开源的在线问题排查工具。较多功能基于Java agent、java ti agent。

以下部分命令能加快排查问题进度。

dashboard

展示线程、内存、gc等信息

heapdump

heapdump --live arthas-output/dump.hprof
生成文件在arthas-output目录,可以通过浏览器下载: http://localhost:8563/arthas-output/

jvm

打印jvm信息:

  • DEADLOCK-COUNT: JVM 当前死锁的线程数
  • MAX-FILE-DESCRIPTOR-COUNT:JVM 进程最大可以打开的文件描述符数

thread

thread -b, 找出当前阻塞其他线程的线程

thread -n 3 展示当前最忙的前 N 个线程并打印堆栈

jad

jad java.lang.String 反编译java.lang.String

jad demo.MathGame main --lineNumber false --lineNumber 参数默认值为 true,显示指定为 false 则不打印行号。

sc

查看 JVM 已加载的类信息

sc demo.* 模糊搜索

sc com.*

sc -d demo.MathGame 打印类的详细信息

排查常规操作

  1. 下载应用Jar包,用于反编译看代码,使用Jd-gui或者idea打开。
  2. jdk提供的命令或arthas针对问题进行排查

jdk命令排查

jstack pid |grep deadlock 找死锁

jmap -dump:live,format=b,file=heap.hprof pid 生成heap.hprof堆快照文件

下载快照文件用Mat打开堆快照文件,内存泄露分析报告生成(慢)

jhat <heap.hprof文件路径> 用于简单看直方图等(快)

arthas排查

上传arthas包,启动并attach到应用进程。

jvm 看死锁线程数

thread -n 3 展示当前最忙的前 N 个线程并打印堆栈

sc com.* 搜索内部编写的类

jad java.lang.String 反编译看代码

0

评论 (0)

取消

浙公网安备 33020502001051号

浙ICP备2023015387号-1