JDK中的命令行工具
本文内容主要学习自《深入理解Java虚拟机》,超赞的一本书强烈推荐!
一,常用JDK监控和故障处理工具
命令名称 | 全称 | 用途 |
---|---|---|
jstat | JVM Statistics Monitoring Tool | 用于收集Hotspot虚拟机各方面的运行数据 |
jps | JVM Process Status Tool | 显示指定系统内所有的HotSpot虚拟机进程 |
jinfo | Configuration Info for Java | 显示虚拟机配置信息 |
jmap | JVM Memory Map | 生成虚拟机的内存转储快照,生成heapdump文件 |
jhat | JVM Heap Dump Browser | 用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户在浏览器上查看分析结果 |
jstack | JVM Stack Trace | 显示虚拟机的线程快照 |
二,命令使用详解
1, jstat:查看虚拟机各云心状态信息
jstat命令可用于显示本地或远程虚拟机进程中的类装载 ,内存,垃圾收集,JIT编译等运行数据。
jstat命令的格式为:
jstat [options vmid [interval[s|ms]] [count] ]
其中若查询的是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程VMID的格式为: [protocol:][//] lvmind[@hostname [:port] /servername]
可用 jstat -options来查询jstat可以搭配哪些操作选项:
options有: -class
监视类装载,卸载数量,总空间以及类装载所耗费的时间
-gc
监视Java堆状况,包括Eden区,两个survivor区,老年代,永久代的容量,已用空间,GC时间合计等信息
-gccapacity
内容与-gc基本相同,但主要输出Java堆各个区域的最大最小空间
-gcutil
内容与-gc基本相同,但主要关注已使用空间占总空间的百分比
-gccause
内容与-gcutil基本相同,但主要关注已使用空间占总空间的百分比,并输出导致上一次GC的原因
-gcnew
监视新生代GC情况
-gcnewcapacity
内容与-gcnew基本相同,但主要输出使用到的最大最小空间
-gcold
监视老年代GC情况
-gcoldcapacity
内容与-gcnew基本相同,但主要输出使用到的最大最小空间
-gcpermcapacity
输出永久代使用到的最大最小空间
-complier
输出JIT 编译器编译过的方法耗时的信息
-printcompliter
输出已经被JIT编译的方法
例如:
其中S0,S1表示Surviver区,E表示新生代Eden区,O表示老年代,YGC表示Young GC,其下面的数字表示GC了多少次,YGCT表示Young GC的耗时,单位为秒,FGC表示Full GC,FGCT表示Full GC的耗时,单位为秒,GCT表示总共的GC时间,为YGCT与FGCT的总和。
2, jps:产看虚拟机进程信息
jps命令可用于查询正在运行的虚拟机进程,同时可选择性的显示虚拟机执行主类,即执行main函数的类,以及进程的本地虚拟机ID(Local Virtual Machine Identifier 简称LVMID)(对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的)
jps的命令格式为:
jps [options] [hostid]
options 有: -q
只输出本地虚拟机进程ID,省略主类名
-m
输出虚拟机进程启动时传递给main()函数的参数
-l
输出进程执行的主类的全名
-v
输出虚拟机进程启动时的JVM参数
hostid可用于查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名
3, jinfo:查看虚拟机配置参数信息
jinfo用于查看和调整虚拟机的配置参数.
jinfo的命令格式为:
jinfo [option] pid
我们可以用jinfo -flags来查询线程的参数,其中的Non-default VM flags为虚拟机默认的设置参数,Command line为用户自行设置的参数,如下图:
4, jmap:生成虚拟机内存转储快照
jmap命令用于获取heapdump文件,且可以查询finalize执行队列,Java堆与永久代的一些信息。
jmap的命令格式为:
jmap [option ] vmid
常用的option选项有: -dump
生成Java堆转储快照,格式为: -dump:[live , ]format=b , file=,其中live子参数 说明只dump出存活的对象
-finalizerinfo
显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-heap
显示Java堆详细信息,如使用哪种回收器,参数配置,分代状况等
例如:
5, jhat:分析虚拟机转储快照信息
jhat命令与jmap命令搭配使用,用于分析jmap生成的堆转储快照,jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。
jhat命令格式:
jhat heapdumpFileName
结合上一步生成的bootstrap.bin文件,可得:
通过访问浏览器http://localhost:7000可得到如下视图:
6, jstack:虚拟机堆栈跟踪
jstack命令用于生成虚拟机当前时刻的线程快照。线程快照指的是当前虚拟机内的每一条线程正在执行的方法堆栈的集合,生成线程快照的作用是,可用于定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等问题,当线程出现停顿时 就可以用jstack各个线程调用的堆栈情况。
jstack命令格式;
jstack [option] vmid
有以下几个options: