前言
为了便于我们分析JVM虚拟机性能与诊断故障,java自带了命令行工具;
JDK的命令行工具
名称 | 全名 | 功能 |
---|---|---|
jps | JVM Process Status | 显示指定系统的所有的虚拟机进程 |
jstat | JVM Statistics Monitoring Tool | 用于收集虚拟机各方面的运行数据 |
jinfo | Configuration Info for Java | 显示虚拟机配置信息 |
jmap | Memory Map for Java | 生成虚拟机的内存转储快照(heapdump文件) |
jhat | JVM Heap Dump Browser | 用于分析heapdump文件 |
jstack | Stack Trace for Java | 显示虚拟机的线程快照 |
jps 虚拟机进程状况工具
jps
: 显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一 ID;
jps -q
:只输出进程的本地虚拟机唯一 ID;
jps -l
:输出主类的全名,如果进程执行的是 Jar 包,输出 Jar 路径;
jps -v
:输出虚拟机进程启动时 JVM 参数;
jps -m
:输出传递给 Java 进程 main() 函数的参数;
jstat 监视虚拟机各种运行状态信息
jstat(JVM Statistics Monitoring Tool) 使用于监视虚拟机各种运行状态信息的命令行工具;
可以显示本地或者远程(需要远程主机提供 RMI 支持)虚拟机进程中的类信息、内存、垃圾收集、JIT 编译等运行数据;
在没有 GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具;
jstat -class vmid
:显示 ClassLoader 的相关信息;
jstat -compiler vmid
:显示 JIT 编译的相关信息;
jstat -gc vmid
:显示与 GC 相关的堆信息;
jstat -gccapacity vmid
:显示各个代的容量及使用情况;
jstat -gcnew vmid
:显示新生代信息;
jstat -gcnewcapcacity vmid
:显示新生代大小与使用情况;
jstat -gcold vmid
:显示老年代和永久代的信息;
jstat -gcoldcapacity vmid
:显示老年代的大小;
jstat -gcpermcapacity vmid
:显示永久代大小;
jstat -gcutil vmid
:显示垃圾收集信息;
加上 -t参数可以在输出信息上加一个 Timestamp 列,显示程序的运行时间
jinfo 实时地查看和调整虚拟机各项参数
jinfo vmid
:输出当前 jvm 进程的全部参数和系统属性 (第一部分是系统的属性,第二部分是 JVM 的参数);
jinfo -flag name vmid
:输出对应名称的参数的具体值;
使用 jinfo 可以在不重启虚拟机的情况下,可以动态的修改 jvm 的参数:
jinfo -flag [+|-]name vmid 开启或者关闭对应名称的参数
jmap 生成堆转储快照
jmap(Memory Map for Java)命令用于生成堆转储快照;
如果不使用 jmap 命令,要想获取 Java 堆转储,可以使用 “-XX:+HeapDumpOnOutOfMemoryError” 参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件,Linux 命令下可以通过 kill -3 发送进程退出信号也能拿到 dump 文件。
jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalizer 执行队列、Java 堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。和jinfo一样,jmap有不少功能在 Windows 平台下也是受限制的。
jhat 分析 heapdump 文件
jhat 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果。
jstack 生成虚拟机当前时刻的线程快照
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合;
生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者在等待些什么资源。
网友评论