| 名称 | 全写 | 主要作用 |
|---|---|---|
| jpa | JVM Process Status Tool | 显示指定系统内所有的 HotSpot 虚拟机进程 |
| jstat | JVM Statistics Monitoring Tool | 用于收集 HotSpot 虚拟机各方面的运行参数 |
| jinfo | Configuration Info for Java | 显示虚拟机配置信息 |
| jmap | Memory Map for Java | 生成虚拟机的内存转储快照(heapdump文件) |
| jhat | JVM Heap Dump Browser | 用于 heapdump 文件,它会建立一个HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果 |
| jstack | Stack Trace for Java | 显示虚拟机的线程快照 |
1. jps 虚拟机进程状况工具
命令格式
jps [ options ] [ hostid ]
执行样例

image.png
其他参数
| 选项 | 作用 |
|---|---|
| -q | 只输出 LVMID ,省略主类的名称 |
| -m | 输出虚拟机进程启动时主类 main() 函数的参数 |
| -l | 输出主类的全名,如果进程执行的是 jar 包,输出 jar 包路径 |
| -v | 输出虚拟机进程启动时 JVM 参数 |
2. jstat 虚拟机统计信息监视工具
命令格式
jstat [ options vmid [interval[s|ms] [count] ] ]
执行样例
250毫秒查询一次进程12914垃圾收集状态,一共查询20次

image.png
其他参数
| 选项 | 作用 |
|---|---|
| -class | 监视类装载、卸载数量、总空间以及类装载所耗费的时间 |
| -gc | 监视 java 堆状况,包括 Eden 区、两个 survivor 区、老年代、永久代等的容量、已用空间、GC时间合计等信息 |
| -gccapacity | 监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间 |
| -gcutil | 监视内容与 -gc 基本相同,但输出主要关注已使用空间占空间的百分比 |
| -gccause | 与 -gcutil 功能一样,但是会额外输出导致上一次 GC 产生的原因 |
| -gcnew | 监视新生代 GC 状况 |
| -gcnewcapacity | 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间 |
| -gcold | 监视老年代 GC 状态 |
| -gcoldcapacity | 监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间 |
| -gcpermcapacity | 输出永久代使用到的最大、最小空间 |
| -compiler | 输出 JIT 编译器编译过的方法、耗时等信息 |
| -printcompilation | 输出已经被 JIT 编译的方法 |
3. jinfo Java配置信息工具
命令格式
jstat [ options ] [ hostid ]
执行样例

image.png
4. jmap Java内存映像工具
命令格式
jstat [ options ] [ hostid ]
执行样例

image.png
其它参数
| 选项 | 作用 |
|---|---|
| -dump | 生成 Java 堆转储快照。格式为:-dump:[live, ]format=b, file=<filename>,其中 live 子参数说明是否只 dump 出存活的对象 |
| -finalizerinfo | 显示在 F-Queue 中等待 finalizer 线程执行 finalize 方法的对象。只在 Linux/Solaris 平台下有效 |
| -heap | 显示 Java 堆详细信息,如使用那种回收期、参数配置、分代状况等。只在 Linux/Solaris 平台下有效 |
| -histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
| -permstat | 已 ClassLoader 为统计口径显示永久代内存状态。只在 Linux/Solaris 平台下有效 |
| -F | 当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成 dump 快照。只在 Linux/Solaris 平台下有效 |
5. jhat 虚拟机堆转储快照分析工具
命令格式
jhat 堆文件
6. jstack Java堆栈跟踪工具
命令格式
jstack [ option ] vmid
执行样例

image.png
其它参数
| 选项 | 作用 |
|---|---|
| -F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
| -l | 除堆栈外,显示关于锁的附件信息 |
| -m | 如果调用到本地方法的话,可以显示 C/C++ 的堆栈 |
在 JDK 1.5中,java.lang.Thread 类新增了一个 getAllStackTraces() 方法用于获取虚拟机中所有线程的 StackTraceElement 对象。使用这个可以随时查看线程堆栈。
for (Map.Entry<Thread, StackTraceElement[]> threadEntry : Thread.getAllStackTraces().entrySet()) {
Thread key = threadEntry.getKey();
StackTraceElement[] value = threadEntry.getValue();
if (key.equals(Thread.currentThread())) {
continue;
}
log.info("线程:" + key.getName());
for (StackTraceElement stackTraceElement : value) {
log.info("{}", stackTraceElement);
}
}