JDK 内置命令行工具
很多情况下,JVM 运行环境中并没有趁手的工具,所以掌握基本的内置工具是一项基本功。
JDK 自带的工具和程序可以分为 2 大类型:
- 开发工具
- 诊断分析工具
JDK 内置的开发工具
写过 Java 程序的同学,对 JDK 中的开发工具应该比较熟悉。 下面列举常用的部分:
工具 | 简介 |
---|---|
java | Java 应用的启动程序 |
javac | JDK 内置的编译工具 |
javap | 反编译 class 文件的工具 |
javadoc | 根据 Java 代码和标准注释,自动生成相关的 API 说明文档 |
javah | JNI 开发时,根据 Java 代码生成需要的 .h 文件。 |
extcheck | 检查某个 jar 文件和运行时扩展 jar 有没有版本冲突,很少使用 |
jdb | Java Debugger 可以调试本地和远端程序,属于 JPDA 中的一个 Demo 实现,供其他调试器参考。开发时很少使用 |
jdeps | 探测 class 或 jar 包需要的依赖 |
jar | 打包工具,可以将文件和目录打包成为 .jar 文件;.jar 文件本质上就是 zip 文件,只是后缀不同。使用时按顺序对应好选项和参数即可。 |
keytool | 安全证书和密钥的管理工具(支持生成、导入、导出等操作) |
jarsigner | jar 文件签名和验证工具 |
policytool | 实际上这是一款图形界面工具,管理本机的 Java 安全策略 |
开发工具此处不做详细介绍,有兴趣的同学请参考文末的链接。
下面介绍诊断和分析工具。
命令行诊断和分析工具
JDK 内置了各种命令行工具,条件受限时我们可以先用命令行工具快速查看 JVM 实例的基本情况。
macOS X、Windows 系统的某些账户权限不够,有些工具可能会报错/失败,假如出问题了请排除这个因素。
JPS 工具简介
我们知道,操作系统提供一个工具叫做 ps,用于显示进程状态(Process Status)。
Java也 提供了类似的命令行工具,叫做 JPS,用于展示 Java 进程信息(列表)。
需要注意的是,JPS 展示的是当前用户可看见的 Java 进程,如果看不见某些进程可能需要 sudo、su 之类的命令来切换权限。
查看帮助信息:
$
jps -help
usage: jps [-help]
jps [-q] [-mlvV] [<hostid>]
Definitions:
<hostid>: <hostname>[:<port>]
复制
可以看到, 这些参数分为了多个组,-help
、-q
、-mlvV
, 同一组可以共用一个 -
。
常用参数是小写的 -v
,显示传递给 JVM 的启动参数。
$
jps -v
15883 Jps -Dapplication.home=/usr/local/jdk1.8.0_74 -Xms8m
6446 Jstatd -Dapplication.home=/usr/local/jdk1.8.0_74 -Xms8m
-Djava.security.policy=/etc/java/jstatd.all.policy
32383 Bootstrap -Xmx4096m -XX:+UseG1GC -verbose:gc
-XX:+PrintGCDateStamps -XX:+PrintGCDetails
-Xloggc:/xxx-tomcat/logs/gc.log
-Dcatalina.base=/xxx-tomcat -Dcatalina.home=/data/tomcat
复制
看看输出的内容,其中最重要的信息是前面的进程 ID(PID)。
其他参数不太常用:
-q
:只显示进程号。-m
:显示传给 main 方法的参数信息-l
:显示启动 class 的完整类名,或者启动 jar 的完整路径-V
:大写的 V,这个参数有问题,相当于没传一样。官方说的跟-q
差不多。- ``:部分是远程主机的标识符,需要远程主机启动
jstatd
服务器支持。
可以看到,格式为 [:]
,不能用 IP,示例:jps -v sample.com:1099
。
知道 JVM 进程的 PID 之后,就可以使用其他工具来进行诊断了。
jstat 工具简介
jstat 用来监控 JVM 内置的各种统计信息,主要是内存和 GC 相关的信息。
查看 jstat 的帮助信息,大致如下:
$
jstat -help
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
Definitions:
<option> 可用的选项,查看详情请使用 -options
<vmid> 虚拟机标识符,格式:<lvmid>[@<hostname>[:<port>]]
<lines> 标题行间隔的频率.
<interval> 采样周期,<n>["ms"|"s"],默认单位是毫秒 "ms"
<count> 采用总次数
-J<flag> 传给jstat底层JVM的 <flag> 参数
复制
再来看看 `` 部分支持哪些选项:
$
jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
复制
简单说明这些选项,不感兴趣可以跳着读。
-class
:类加载(Class loader)信息统计。-compiler
:JIT 即时编译器相关的统计信息。-gc
:GC 相关的堆内存信息,用法:jstat -gc -h 10 -t 864 1s 20
。-gccapacity
:各个内存池分代空间的容量。-gccause
:看上次 GC、本次 GC(如果正在 GC 中)的原因,其他输出和-gcutil
选项一致。-gcnew
:年轻代的统计信息(New = Young = Eden + S0 + S1)。-gcnewcapacity
:年轻代空间大小统计。-gcold
:老年代和元数据区的行为统计。-gcoldcapacity
:old 空间大小统计。-gcmetacapacity
:meta 区大小统计。-gcutil