文章目录
- 命令行工具
-
- [jps - 查看Java进程](#jps - 查看Java进程)
- [jstat - 监控JVM统计信息](#jstat - 监控JVM统计信息)
- [jmap - 内存映像工具](#jmap - 内存映像工具)
- [jstack - 线程堆栈分析](#jstack - 线程堆栈分析)
- [jinfo - 查看和修改JVM参数](#jinfo - 查看和修改JVM参数)
- 图形化工具
-
- [JConsole - 基础监控工具](#JConsole - 基础监控工具)
- [VisualVM - 功能全面的分析工具](#VisualVM - 功能全面的分析工具)
- [Arthas - 阿里开源的神器](#Arthas - 阿里开源的神器)
命令行工具
jps - 查看Java进程
这是最基础的工具,相当于Linux的ps命令,专门用来查看Java进程。
基本用法:
bash
jps # 显示所有Java进程
jps -l # 显示完整的类名或jar包路径
jps -v # 显示JVM参数
jps -m # 显示传给main函数的参数
实际场景:
当服务器上跑了多个Java应用,你想知道哪个进程是你要监控的时候,jps就派上用场了。比如你的应用叫UserService,直接jps -l就能找到对应的进程ID。
jstat - 监控JVM统计信息
这个工具能告诉你内存使用情况、垃圾回收频率等关键指标。
常用命令:
bash
jstat -gc pid # 查看垃圾回收情况
jstat -gcnew pid # 统计新生代的情况
jstat -gccapacity pid # 查看各代内存容量
jstat -gcutil pid # 查看各代内存使用百分比
输出结果:
- S0C、S1C:Survivor区容量
- EC:Eden区容量
- OC:老年代容量
- YGC:年轻代GC次数
- YGCT:年轻代GC耗时
- FGC:Full GC次数
- FGCT:Full GC耗时
jmap - 内存映像工具
这个工具主要用来分析内存使用情况,特别是在发生内存溢出时,它能帮你保留现场。
常用命令:
bash
jmap -histo pid # 查看对象分布统计
jmap -histo pid | head -20 # 只看前20行
jmap -dump:format=b,file=heap.hprof pid # 生成堆转储文件
jmap -dump:live,format=b,file=heap.hprof pid # 只dump存活对象
jstack - 线程堆栈分析
这个工具用来查看所有线程在干什么,特别适合排查死锁、线程阻塞等问题。
基本用法:
bash
jstack pid # 查看所有线程状态
jstack pid > threads.txt # 保存到文件
怎么看线程状态:
- RUNNABLE:正在运行
- BLOCKED:被阻塞,等待获取锁
- WAITING:等待被唤醒
- TIMED_WAITING:限时等待
jinfo - 查看和修改JVM参数
这个工具可以在不重启应用的情况下查看甚至修改某些JVM参数。
常用命令:
bash
jinfo pid # 查看所有JVM参数
jinfo -flags pid # 只查看-XX参数
jinfo -flag PrintGC pid # 查看某个具体参数
jinfo -flag +PrintGC pid # 开启某个参数
jinfo -flag -PrintGC pid # 关闭某个参数
图形化工具
JConsole - 基础监控工具
JConsole是JDK自带的图形化监控工具,界面简单直观。
启动方式:
bash
jconsole # 直接启动,选择要监控的进程
jconsole pid # 直接连接指定进程
主要功能:
- 内存使用情况:能看到各个内存区域的使用趋势
- 线程情况:包括线程数量、死锁检测
- 类加载情况:已加载的类数量
VisualVM - 功能全面的分析工具
VisualVM功能比JConsole强大很多,是很多开发者的首选。
主要功能:
- 实时监控:CPU、内存、线程使用情况
- 性能分析:CPU采样、内存采样
- 堆转储分析:可以直接在工具内分析heap dump文件
使用建议:
VisualVM特别适合本地开发时使用。如果要监控远程服务器,需要配置JMX连接参数。
Arthas - 阿里开源的神器
Arthas是阿里开源的Java诊断工具,可以说是目前最好用的线上诊断工具,没有之一。
基础诊断:
bash
dashboard # 实时查看系统信息,比jstat更直观
thread # 查看线程信息,比jstack更详细
jvm # 查看JVM信息
memory # 查看内存信息
从Arthas的一些基本命令我们就可以得到非常丰富、全面的信息,比之前的命令行工具好用多了。
作用:
- 它可以实时监控方法调用、追踪性能瓶颈、分析内存和线程问题。
- 以前线上出问题只能通过日志猜测或者重启应用,现在用Arthas可以调用链路耗时、线程状态等详细信息,更有利于我们排查线上问题。