本文主要解析JVM分析指令-jps/jinfo/jstat/jstack/jmap
jps
英文全名: Java Virtual Machine Process Status Tool
功能: Java虚拟机进程状态工具,正如其名查询虚拟机进程状态的工具,系统层面的工具,故输出的数据都是基础的系统层面数据
指令 | 显示内容 |
---|---|
jps -V | pid+VM标识 |
jps -q | pid |
jps -l | pid + 完全的包名/应用主类名 |
jps -v | pid + 完整启动指令 |
jps -m | pid + 传递给main的参数 |
jps -V
jps -q
jps -l
jps -v
jps -
jinfo
英文全名: Java Virtual Machine Configuration Information
功能: Java虚拟机配置信息,可以实时查看Java虚拟机各种配置参数和系统属性的命令行工具,可以配合jps获取到pid使用
- 查看VM指令的参数
- 动态关闭/启用虚拟机配置-并不是所有配置都可以动态修改 java -XX:+PrintFlagsInitial | grep manageable(参考支持动态修改的)
- 动态设置虚拟机配置
指令 | 显示内容 |
---|---|
jinfo pid | VM所有配置参数与系统属性 |
jinfo -flag VM指令 pid | 查看VM指令情况 |
jinfo -flag -VM指令 pid | 关闭指定的VM指令 |
jinfo -flag +VM指令 pid | 开启指定的VM指令 |
C:\Users\44349>jinfo -help //查看帮助文档-windows环境
Usage:
jinfo [option] <pid> //连接方式 pid
(to connect to running process)
jinfo [option] <executable <core> //可执行文件
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname> //ip或域名等
(to connect to remote debug server)
where <option> is one of:
-flag <name> to print the value of the named VM flag //打印VM指令的参数
-flag [+|-]<name> to enable or disable the named VM flag //动态关闭/启用虚拟机配置
-flag <name>=<value> to set the named VM flag to the given value //动态设置虚拟机配置
-flags to print VM flags //打印虚拟机配置
-sysprops to print Java system properties //打印java系统持续配置
<no option> to print both of the above //空配置,默认打印上面两个指令数据
-h | -help to print this help message //打印帮助文档
C:\Users\44349>jinfo -flag PrintGC 28692 //查看是否配置了PrintGC
-XX:+PrintGC //有配置
C:\Users\44349>jinfo -flag -PrintGC 28692 //动态关闭PrintGC 配置
C:\Users\44349>jinfo -flag PrintGC 28692 //查看是否配置了PrintGC
-XX:-PrintGC//被关闭了
C:\Users\44349>jinfo -flag +PrintGC 28692//动态打开PrintGC 配置
jstat
英文全名: Monitors Java Virtual Machine (JVM) statistics
功能: 监视Java虚拟机(JVM)统计信息,各种JVM统计数据
指令 | 显示内容 |
---|---|
jstat -class pid | 类装载信息 |
jstat -compiler pid | JIT编译类信息 |
jstat -gc pid | GC次数等信息 |
jstat -gccapacity pid | 显示有关世代容量及其相应空间的统计信息 |
jstat -gccause pid | 显示有关垃圾回收统计信息(与 相同)的摘要,以及上次和当前(如果适用)垃圾回收事件的原因 |
jstat -gcnew pid | 显示有关新一代行为的统计信息 |
jstat -gcnewcapacity pid | 显示有关新一代大小及其相应空间的统计信息 |
jstat -gcold pid | 显示有关老一代行为的统计信息和元空间统计信息 |
jstat -gcoldcapacity pid | 显示有关旧一代大小的统计信息 |
jstat -gcmetacapacity pid | 显示有关元空间大小的统计信息 |
jstat -gcutil pid | 显示有关垃圾回收统计信息的摘要 |
jstat -printcompilation pid | 显示 Java 热点虚拟机编译方法统计信息 |
官网对每个指令描述非常详细: https://docs.oracle.com/en/java/javase/17/docs/specs/man/jstat.html
C:\Users\44349>jstat -gc 20832
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC(full gc 次数) FGCT(full gc 花费时间) GCT
18432.0 29184.0 18234.5 0.0 572416.0 221287.4 375296.0 35752.8 80384.0 75304.5 10752.0 9807.2 10 0.109 3 0.148 0.258
jstack
英文全名: Java stack
功能: 打印Java程序线程的堆栈跟踪,可以用来查看代码内锁情况
指令 | 显示内容 |
---|---|
jstack -l pid | 打印有关锁的附加信息-可以用来查看线程死锁 |
jstack -m pid | 打印Java和本机帧(混合模式) |
jstack -F pid | 使程序STW执行指令 |
C:\Users\44349>jstack -h
Usage:
jstack [-l] <pid> //使用pid指定被执行的java程序
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core> //使用可执行文件指定被执行的java程序
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname> //使用Ip或域名等指定被执行的java程序
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung) //使程序STW执行指令
-m to print both java and native frames (mixed mode) //打印Java和本机帧(混合模式)
-l long listing. Prints additional information about locks //打印有关锁的附加信息-可以用来查看线程死锁
-h or -help to print this help message
jmap
英文全名: Java Virtual Machine Memory Map
功能: Java虚拟机内存映射,打印详细信息
指令 | 显示内容 |
---|---|
jmap -heap pid | heap数据信息 |
jmap -histo:live pid | 打印Java对象堆的直方图;如果指定了"live"子选项,则只计算活动对象 |
jmap -clstats pid | 打印类加载器列表,包括继承了java.lang.ClassLoader |
jmap -finalizerinfo pid | 打印等待Object.finalize()执行的对象 |
jmap -dump,format=b,file=保存路径 pid | 导出heap数据 |
C:\Users\44349>jmap -h //打印帮助文档
Usage:
jstack [-l] <pid> //使用pid指定被执行的java程序
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core> //使用可执行文件指定被执行的java程序
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname> //使用Ip或域名等指定被执行的java程序
(to connect to a remote debug server)
where <option> is one of:
<none> to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live" //打印Java对象堆的直方图;如果指定了"live"子选项,则只计算活动对象
suboption is specified, only count live objects
-clstats to print class loader statistics //打印类加载器列表,包括继承了java.lang.ClassLoader
-finalizerinfo to print information on objects awaiting finalization //打印等待Object.finalize()执行的对象
-dump:<dump-options> to dump java heap in hprof binary format //导出heap数据
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file=<file> dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F force. Use with -dump:<dump-options> <pid> or -histo //STW执行
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J<flag> to pass <flag> directly to the runtime system
jcmd
功能: 在看jdk的虚拟线程(可以简单理解成协程)
虚拟线程无法被普通命令直接被检测,jcmd是提供的可观察虚拟线程的工具
指令 | 显示内容 |
---|---|
jcmd Thread.dump_to_file -format=<output_file> | 线程信息 |
jcmd 14136 Thread.dump_to_file -format=json monitor.json
会导出json文件,搜索:ThreadPerTaskExecutor@ 即可看到虚拟线程
JDK17提供的所有tool文档
https://docs.oracle.com/en/java/javase/17/docs/specs/man/index.html