线上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 打印类的详细信息
排查常规操作
- 下载应用Jar包,用于反编译看代码,使用Jd-gui或者idea打开。
- 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)