始于足下.|

MuXinu

园龄:2年7个月粉丝:3关注:1

Java中常用命令jstat、jmap、jstack(基于jdk1.8)

在 Java 性能调优和故障排查中,jstatjmapjstack 是三种常用的命令行工具,主要用于 监控 GC、查看内存快照、分析线程状态


1. jstat(JVM 统计信息监控)

用于 实时监控 JVM 运行状态,主要关注 GC、类加载、编译 等信息。

option: 参数选项
-t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间
-h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头
vmid: Virtual Machine ID( 进程的 pid)
interval: 执行每次的间隔时间,单位为毫秒
count: 用于指定输出多少次记录,缺省则会一直打印

option 可以从下面参数中选择
    -class 显示ClassLoad的相关信息;
    -compiler 显示JIT编译的相关信息;
    -gc 显示和gc相关的堆信息;
    -gccapacity    显示各个代的容量以及使用情况;
    -gcmetacapacity 显示metaspace的大小
    -gcnew 显示新生代信息;
    -gcnewcapacity 显示新生代大小和使用情况;
    -gcold 显示老年代和永久代的信息;
    -gcoldcapacity 显示老年代的大小;
    -gcutil   显示垃圾收集信息;
    -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
    -printcompilation 输出JIT编译的方法信息;

常用命令

jstat -gc <pid> 1000 10  # 每秒显示 GC 状态,执行 10 次
jstat -gcutil <pid> 1000  # 每秒显示 GC 占用率
jstat -class <pid>  # 显示加载class的数量,及所占空间等信息
jstat -compiler <pid>  # 查看 JIT 编译情况
jstat -gccapacity <pid> #JVM内存中三代(young,old,perm)对象的使用和占用大小
jstat -gcmetacapacity<pid>   # metaspace 中对象的信息及其占用量。

示例

jstat -gcutil 177101 1000 5
  • 177101:进程 ID
  • 1000:间隔 1 秒
  • 5:执行 5 次
  • 输出示例
    image

📌 参数说明

参数 含义
S0, S1 Survivor 区使用率
E Eden 区使用率
O Old 区使用率
M Metaspace(元空间)使用率
CCS 类压缩空间
YGC, YGCT 年轻代 GC 次数、时间
FGC, FGCT Full GC 次数、时间
GCT GC 总时间

2. jmap(内存映射分析)

用于 查看堆内存、导出 heap dump
image

常用命令

jmap -heap <pid>  # 查看堆信息
jmap -histo <pid>  # 按对象数量统计实例个数,如果指定了live子选项,则只计算活动的对象。
jmap -dump:format=b,file=heap.bin <pid>  # 导出堆快照

示例

jmap -heap 12345
  • 输出示例
    image

📌 参数说明

参数 含义
NewSize 新生代大小
MaxHeapSize 最大堆大小
MetaspaceSize 元空间大小

3. jstack(线程快照分析)

用于 查看 Java 线程状态,分析死锁、阻塞情况

常用命令

jstack -l <pid>  # 查看线程堆栈
jstack -F <pid>  # 强制生成堆栈信息(进程无响应时使用)

示例

jstack 12345
  • 输出示例
    "main" #1 prio=5 os_prio=0 tid=0x0000000002dcd000 nid=0x168c runnable [0x0000000000000000]
       java.lang.Thread.State: RUNNABLE
         at java.io.FileOutputStream.writeBytes(Native Method)
         at java.io.FileOutputStream.write(FileOutputStream.java:345)
    

📌 线程状态

状态 说明
RUNNABLE 线程正在运行
WAITING 线程在等待(如 Object.wait()
BLOCKED 线程被锁住
TIMED_WAITING 线程超时等待

分析死锁

jstack -l 12345 | grep -A 10 "Found one Java-level deadlock"
  • 如果有死锁,jstack 会输出 Found one Java-level deadlock 及相关堆栈信息。

总结

命令 作用 适用场景
jstat 监控 GC、类加载、编译 分析 GC、内存占用
jmap 查看堆、导出 heap dump 内存泄漏分析
jstack 线程快照 线程阻塞、死锁分析

本文作者:MuXinu

本文链接:https://www.cnblogs.com/MuXinu/p/18714860

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   MuXinu  阅读(14)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起