JDK自带工具详解
jps
类似 ps 命令,可以列出正在运行的虚拟机进程ID。
选项:
- -l 输出主类的全限定名,或jar包名称
- -v 输出虚拟机启动时指定的jvm参数
$ jps -lv
21656 hello.jar -Xms256m -Xmx512mjcmd
与jps -l类似,但除了输出pid和主类外,还会输出启动时指定的命令行参数
另外使用jcmd <pid> <command>还支持向虚拟机发送一些指令,具体支持的指令列表可以通过help指令来查看。
例如:jcmd 7833 VM.flags可以查看JVM参数。
jinfo
jinfo [option] pid
用于查看jvm参数,甚至可以实时调整部分参数。与jps的区别是jps -v只能查看显式指定的参数。
选项:
- -flags 查看所有VM flags
- -sysprops 查看System.getProperties()的结果,包括一些运行环境信息和环境变量等
- 不带选项,同时显示上述两种信息
通过-flag还能实时调整部分jvm参数:
- -flag <name> 查看flag的值
- -flag [+|-] <name> 打开或关闭flag
- -flag <name>=<value> 设置flag的值
jstat
jstat -<option> [-t] [-hn] <pid> [<interval> [<count>]]
对虚拟机运行状态的统计。
通用参数:
- -t 在第一列输出时间戳,从虚拟机启动时开始计算
- -h 后面跟一个整数,指定每n行输出一次表头
- pid 必填,jvm的进程ID
- interval 执行间隔,单位ms或s,默认是ms
- count 一共执行多少次
options:
- -class 监视类装载、卸载数量、总空间以及类装载所耗费的时间
- -gc 可以显示gc的信息,其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间
- -gcutil 与-gc相同,只是结果以百分比显示
各项表头的含义:
- S0 survivor0空间使用率
- S1 survivor1空间使用率
- E Eden区使用率
- O 老年代使用率
- P 永久代使用率(Java7)
- M 元数据区使用率(Java8+)
- CCS 类指针压缩空间使用率(Java8+)
以上各项+C表示空间容量大小,+U表示已使用容量大小,例如EC/EU分别表示Eden区的总容量和已使用容量。
jstack
jstack <pid>
用于生成虚拟机当前时刻的线程快照,输出线程的方法堆栈、线程状态、锁信息,排查并发问题。因此有人也把jstack称为 threaddump 。
选项:
- -l 输出锁的信息
- -m 输出本地方法栈
- -F 当进程没有响应时,强制输出线程dump
# 可以使用grep来过滤关键字,输出所在行和后面10行的信息
jstack -l 26073 | grep -A 10 Thread-226提示
借助操作系统的top -Hp <pid>命令也可以查到线程状态,查出的第一列PID即为线程ID(10进制),通过printf "%x\n" PID把这个ID转换成16进制即可与jstack的结果进行对应,对应到nid字段。
jmap
jmap命令可以获取堆的信息,也有人把jmap称为 heapdump 。
jmap的常见用法有以下几种:
jmap -dump:[live, ]format=b, file=<filename>,真正的堆dump命令,live参数说明是否只dump存活对象。需要注意的是,dump出来的文件往往会非常大,且不建议在服务端直接进行分析处理,会影响应用性能。通常会把dump的文件下载到专门的机器上用VisualVM等工具进行可视化分析。在实际应用中并不特别实用。
jmap -histo[:live] pid,显示堆中的对象统计信息,包括类名、实例数量、合计容量。
jmap -heap pid,显示java堆详细信息,例如回收器、参数配置、分代状况等。
jmap -clstats pid(Java8)查看类加载器的统计信息,包括类加载器的类型、名称、加载类的数量、占用容量、父加载器、是否存活等。实测跑起来很慢,慎用。
javap
用于分析class文件
javap -verbose SomeClass
VisualVM
VisualVM是java自带的可视化综合工具,后续再详细介绍。 😄