欢迎关注专栏:性能测试和优化
排查工具介绍
JVM工具
jstack
jstack
命令可以生成 JVM 当前时刻的线程快照,包括线程的调用栈、状态等,常用于分析线程状态、排查死锁、线程阻塞、CPU 占用高等问题。
基本命令如下:
jstack 进程ID
输出如下:
jstat
jstat
命令允许以固定的监控频次输出 JVM 的资源使用情况,常用于分析垃圾回收情况、排查内存泄漏等问题。
基本命令如下:
jstat -gcutil -h10 <PID> 1000 # 每1秒输出一次GC统计,每10行显示表头
输出如下:
➜ ~ jstat -gcutil 23940 5000 100
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
0.00 100.00 0.36 87.63 94.30 81.06 539 14.021 33 3.972 837 0.976 18.968
0.00 100.00 0.60 69.51 94.30 81.06 540 14.029 33 3.972 839 0.978 18.979
0.00 0.00 0.50 99.81 94.27 81.03 548 14.143 34 4.002 840 0.981 19.126
0.00 100.00 0.59 70.47 94.27 81.03 549 14.177 34 4.002 844 0.985 19.164
0.00 100.00 0.57 99.85 94.32 81.09 550 14.204 34 4.002 845 0.990 19.196
0.00 100.00 0.65 77.69 94.32 81.09 559 14.469 36 4.198 847 0.993 19.659
0.00 100.00 0.65 77.69 94.32 81.09 559 14.469 36 4.198 847 0.993 19.659
0.00 100.00 0.70 35.54 94.32 81.09 567 14.763 37 4.378 853 1.001 20.142
0.00 100.00 0.70 41.22 94.32 81.09 567 14.763 37 4.378 853 1.001 20.142
0.00 100.00 1.89 96.76 94.32 81.09 574 14.943 38 4.487 859 1.007 20.438
0.00 100.00 1.39 39.20 94.32 81.09 575 14.946 38 4.487 861 1.010 20.442
- S0/S1:Survivor区使用率(0~100%)
- E:Eden区使用率
- O:老年代使用率
- M:元空间使用率
- YGC/YGCT:Young GC次数/耗时
- FGC/FGCT:Full GC次数/耗时
jmap
jmap
命令可以生成堆转储快照,常用于分析JVM的垃圾收集器行为、排查堆内存溢出等问题。
生成堆转储文件的命令:
jmap -dump:format=b,file=heap_dump.hprof <PID>
分析堆转储:
- 使用 MAT 打开
heap_dump.hprof
。 - 查找
Histogram
中对象数量异常的类。
Jconsole
JConsole
是一个基于JMX的GUI工具,用于连接正在运行的JVM,提供强大的可视化界面,允许实时查看堆内存、线程、类加载、MBean等。
查看堆内存使用情况
查看线程情况
查看MBean
VisualVM
VisualVM
是一个集成多个JDK命令行工具的可视化工具,可以作为Java应用程序性能分析和运行监控的工具。开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。
查看堆内存使用情况
查看线程情况
工具对比与选型建议
工具 | 核心功能 | 适用场景 | 操作系统 |
---|---|---|---|
jstack | 线程快照、死锁检测 | 线程阻塞、死锁排查 | Windows/Linux |
jstat | GC统计、内存分区监控 | GC调优、内存泄漏初筛 | Windows/Linux |
jmap | 堆转储生成 | OOM问题分析 | Windows/Linux |
JConsole | 图形化综合监控 | 实时运行时状态监控 | Windows/Linux |
VisualVM | 图形化综合监控 | 实时运行时状态监控 | Windows/Linux |