相关文章:
在生产环境下,程序或多或少都会碰到卡顿、CPU 占用率高等问题,而因为是生产环境,我们不能随意地关闭或重启程序。此时,我们可以通过 JDK 自带的状态监控命令和图形化管理工具来定位和解决问题,并作出相应的优化
一、jps (JVM Process Status Tool)
-
用于列出正在运行的虚拟机进程,并显示虚拟机执行主类 (main() 方法所在的类) 名称以及虚拟机进程 ID
-
命令格式
- jps [options] <hostid>
-
格式说明
参数名 含义 options 命令参数 hostid 进程 ID -
命令参数
参数名 含义 -q 只查看虚拟机进程 ID,忽略主类名称 -m 查看虚拟机启动时传递给主类 main() 方法的参数 -l 查看主类全名或 jar 包路径 -v 查看虚拟机启动时的 JVM 参数 -
示例
-
查看主类全名或 jar 包路径
-
二、jinfo (Configuration Info for Java)
-
用于实时查看和调整虚拟机的各项参数
-
命令格式
-
jinfo [option] <pid>
-
jinfo [option] <executable core>
-
jinfo [option] [server_id] <remote server IP or hostname>
-
-
格式说明
参数名 含义 option 命令参数 pid 进程 ID executable core 可执行文件 server_id 调试服务器在远程服务器上的唯一 ID remote server IP or hostname 远程服务器的 IP 地址或 hostname -
命令参数
参数名 含义 -flag <name> 查看指定参数 -flag [+/-] <name> 打开或关闭指定参数 -flag <name> = <value> 设置参数 -flags 查看所有 JVM 参数 -sysprops 查看所有系统参数 <no-option> 查看所有 JVM 参数和系统参数 -h 查看命令帮助信息 -help 查看命令帮助信息 -
示例
-
查看最大内存
-
查看是否启用了 CMS 收集器
-
查看是否启用了 G1 收集器
-
查看是否启用了 Parallel Scavenge 收集器
-
三、jstat (JVM Statistics Monitoring Tool)
-
用于查看虚拟机各种运行状态信息
-
可以显示本地或远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据
-
命令格式
- jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
-
格式说明
参数名 含义 option 命令参数 -t 将时间戳置为样本输出的第一列
时间戳指的是目标 JVM 自启动以来经过的毫秒数-h 每隔 n 个样本显示一行标题,n 为正整数
默认为 0 只显示第一行数据的标题lines 标题行之间的样本数 vmid 进程 ID interval 采样间隔,取值范围 [s, ms],默认为 ms (可省略不写) count 采样次数 -
命令参数
参数名 含义 -class 查看类加载、卸载数量、总空间以及类装载所耗费的时间 -gc 查看 Java 堆状况,包括 Eden 区、2 个 Survivor 区、老年代、永久代等的容量,已用空间,垃圾收集时间合计等信息 -gccapacity 查看 Java 堆状况,主要关注 Java 堆各个区域使用到的最大、最小空间 -gcutil 查看 Java 堆状况,主要关注已使用空间占总空间的百分比 -gccause 作用与 -gcutil
一样,但是会额外输出导致上一次垃圾收集产生的原因-gcnew 查看新生代垃圾收集状况 -gcnewcapacity 查看新生代垃圾收集状况,主要关注使用到的最大、最小空间 -gcold 查看老年代垃圾收集状况 -gcoldcapacity 查看老年代垃圾收集状况,主要关注使用到的最大、最小空间 -gcmetacapacity 查看元空间使用到的最大、最小空间 -compiler 查看即时编译器编译过的方法、耗时等信息 -printcompilation 查看已经被即时编译的方法 -
示例
-
查看类加载器行为统计信息
-
查看堆行为统计信息
-
-
输出说明
-
查看类加载器行为统计信息
字段 含义 Timestamp 目标 JVM 自启动以来经过的毫秒数 Loaded 加载的类数 Bytes 加载的字节数 Unloaded 卸载的类数 Bytes 卸载的字节数 Time 执行类加载和类卸载消耗的时间 -
查看有关垃圾回收堆行为的统计信息
字段 含义 Timestamp 目标 JVM 自启动以来经过的毫秒数 S0C survivor0 空间大小 S1C survivor1 空间大小 S0U survivor0 已使用空间大小 S1U survivor1 已使用空间大小 EC Eden 空间大小 EU Eden 已使用空间大小 OC 老年代空间大小 OU 老年代已使用空间大小 MC 元空间大小 MU 元空间已使用大小 CCSC 压缩类空间大小 CCSU 压缩类已使用空间大小 YGC 新生代垃圾回收次数 YGCT 新生代垃圾回收消耗的时间 FGC 老年代垃圾回收次数 FGCT 老年代垃圾回收消耗的时间 GCT 垃圾回收消耗的总时间 -
其余命令输出字段含义,详见官方文档
-
四、jmap (Memory Map for Java)
-
用于生成堆转储快照 (dump 文件)
-
可以结合其他工具,用于定位程序内存溢出等问题
-
命令格式
-
jmap [options] <pid>
-
jmap [options] <executable core>
-
jmap [options] [server_id] <remote server IP or hostname>
-
-
格式说明
参数名 含义 option 命令参数 pid 进程 ID executable core 可执行文件 server_id 调试服务器在远程服务器上的唯一 ID remote server IP or hostname 远程服务器的 IP 地址或 hostname -
命令参数
参数名 含义 <no-option> 查看目标 JVM 中加载的每个共享对象的起始地址、映射大小和共享文件的完整路径 -dump:[live], [format=b], [file=filename] 生成 Java 堆的 dump 文件
live:只转储堆中存活的对象,如果没有指定则转储所有对象
format=b:二进制格式
file=filename:dump 文件名称-finalizerinfo 查看在 F-Queue 中等待 Finalizer 线程执行 finalizer() 方法的对象信息 -heap 查看 Java 堆详细信息,如使用哪种回收器、参数配置、分代状况等 -histo[:live] 查看 Java 堆中对象统计信息,包括类、实例数量、合计容量
live:仅查看存活对象的统计信息-clstats 查看类加载器统计信息,包括它的名称、活动程度、地址、父类加载器、加载的类数量、加载的类大小等信息 -F 当虚拟机进程对 -dump
命令没有响应时,可使用该选项强制生成 dump 文件-h 查看命令帮助信息 -help 查看命令帮助信息 -
示例
-
生成堆转储快照 (dump 文件)
-
五、jstack (Stack Trace for Java)
-
用于生成当前时刻线程快照
-
可以用于定位程序长时间卡顿的原因,如死锁、死循环等
-
命令格式
-
jstack [options] <pid>
-
jstack [options] <executable core>
-
jstack [options] [server_id] <remote server IP or hostname>
-
-
格式说明
参数名 含义 options 命令参数 pid 进程 ID executable core 可执行文件 server_id 调试服务器在远程服务器上的唯一 ID remote server IP or hostname 远程服务器的 IP 地址或 hostname -
命令参数
参数名 含义 -F 当正常输出的请求没有被响应时,强制输出线程堆栈 -l 查看线程堆栈信息,并同时查看锁的附加信息 -m 如果调用了本地方法,可用于查看 C/C++ 的堆栈信息 -h 查看命令帮助信息 -help 查看命令帮助信息 -
示例
-
查看线程堆栈信息
-
六、jhat (JVM Heap Analysis Tool)
-
用于分析堆转储快照 (dump 文件),并启动 Web 服务器,将分析结果以 Html 的形式展示出来,默认端口为 7000
-
命令格式
- jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
-
命令参数
参数名 含义 -Jflag 将指令传递给虚拟机,如:-J-Xmx512m 表示能使用的最大堆大小为 512 MB -stack <bool> 是否关闭跟踪对象分配调用堆栈,默认为 true -refs <bool> 是否关闭对对象的引用跟踪,默认为 true -port <port> 指定 Web 服务器的端口,默认为 7000 -exclude <file> 指定一个文件,该文件列出了应从可达对象查询中排除的数据成员 -baseline <file> 指定 Java 堆 dump 文件的基准
两个 dump 文件中具有相同 ID 的对象标记为不是新对象,其他对象标记为新对象,这对于比较两个不同 dump 文件很有帮助-debug <int> 设置调试级别
0:没有调试输出
1:调试 hprof 文件解析
2:调试 hprof 文件解析,没有服务器-version 查看版本信息 -h 查看命令帮助信息 -help 查看命令帮助信息 -
示例
-
启用 Web 服务分析 dump 文件
-
七、归纳总结
命令 | 作用 |
---|---|
jps | 用于列出正在运行的虚拟机进程 |
jinfo | 用于实时查看和调整虚拟机的各项参数 |
jstat | 用于查看虚拟机各种运行状态信息 |
jmap | 用于生成堆转储快照 (dump 文件) |
jstack | 用于生成当前时刻线程快照 |
jhat | 用于分析堆转储快照 (dump 文件) |