前面的博文我们介绍了一些关于jvm的一些基础知识,本文介绍一些jdk的命令行工具,通过这些工具我们可以对运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore 文件)、堆转储快照(heapdump/hprof 文件)等文件进行分析,从而定位解决问题。
jdk的彬目录中有许多命令行工具,其中java.exe
、javac.exe
这两个命令行工具是我们最熟悉的。同时,还有其他的许多命令行工具,我们今天介绍的就是这些命令行工具中的一部分。bin目录内容如下图所示。
本文介绍的主要jdk命令:
命令名称 | 全称 | 用途 |
---|---|---|
jps | JVM Process Status Tool | 显示指定系统内所有的HotSpot虚拟机进程 |
jstat | JVM Statistics Monitoring Tool | 用于收集Hotspot虚拟机各方面的运行数据 |
jinfo | Configuration Info for Java | 显示虚拟机配置信息 |
jmap | JVM Memory Map | 生成虚拟机的内存转储快照,生成heapdump文件 |
jhat | JVM Heap Dump Browser | 用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户在浏览器上查看分析结果 |
jstack | JVM Stack Trace | 显示虚拟机的线程快照 |
jps
命令是最常用的命令,可用于查询正在运行的虚拟机进程,同时可选择性的显示虚拟机执行主类,即执行main函数的类,以及进程的本地虚拟机ID(Local Virtual Machine Identifier 简称LVMID)(对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的)。
jps的命令格式为:
jps [options] [hostid]
jps
中 options
的主要选项如下所示。选项 | 作用 | 实例 |
---|---|---|
-q | 只输出本地虚拟机进程ID,省略主类名 | |
-m | 输出虚拟机进程启动时传递给main()函数的参数 | |
-l | 输出进程执行的主类的全名 | |
-v | 输出虚拟机进程启动时的JVM参数 |
* hostid
可用于查询开启了RMI服务的远程虚拟机进程状态,hostid
为RMI注册表中注册的主机名。
jstat命令可用于显示本地或远程虚拟机进程中的类装载 ,内存,垃圾收集,JIT编译等运行数据。再没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。 jps的命令格式为:
jstat [options vmid [interval[s|ms]] [count] ]
其中若查询的是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程VMID的格式为:
[protocol:][//] lvmind[@hostname [:port] /servername]
参数interval
和count
代表查询的间隔和次数,如果省略这两个参数,说明只能查询一次。假设需要每150毫秒查询一次进程2764垃圾收集的状况,一共查询20次,那命令应当是:
jstat -gc 2764 250 20
选项options
代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况,具体选项及作用请参考下表的描述:
选项 | 作用 |
---|---|
-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表示Survivor区,E表示新生代Eden区,O表示老年代(Old),P表示永久代(Permanent)。YGC(Young GC)表示MInor GC,其下面的数字表示GC了多少次,YGCT(Young GC Time)表示Minor GC的耗时,单位为秒,FGC表示Full GC的次数,FGCT表示Full GC的耗时,单位为秒,GCT表示总共的GC时间,为YGCT与FGCT的总和。
jinfo用于实时地查看和调整虚拟机的各项参数。 jinfo的命令格式为:
jinfo [option] pid
option
选项的具体内容如下所示:
选项 | 作用 | 参考文章 |
---|---|---|
-sysprops | 把虚拟机进程的System.getProperties()的内容打印出来 | |
-flag ‹name› | 打印出名为name的value值 | |
-flag[+ | -] ‹name› | 启用或禁用虚拟机参数 |
-flag ‹name› = ‹value› | 修改运行期的虚拟机的参数值 | |
flags | 打印虚拟机启动时未被显示指定的所有系统默认值 | |
`-h | -help` | 打印帮助信息 |
我们可以用jinfo -flags
来查询线程的参数,其中的Non-default VM flags
为虚拟机默认的设置参数,Command line
为用户自行设置的参数,如下图:
jmap 命令一般用于生成堆转储快照(一般称为heapdump 或 dump 文件)。且可以查询finalize执行队列,Java堆与永久代的一些信息。 * jmap的命令格式为:*
jmap [option ] vmid
常用的option选项有:
选项 | 作用 |
---|---|
-dump | 生成Java堆转储快照,格式为: -dump:[live , ]format=b , file=‹filename›,其中live子参数说明只dump出存活的对象显示在F-Queue中等待Finalizer线程执行finalize方法的对象 |
-finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象 |
-heap | 显示Java堆详细信息,如使用哪种回收器,参数配置,分代状况等 |
示例:
jhat
命令可以与jmap
搭配使用,来分析jmap
生成的堆转储快照。生成dump文件的分析结果后,可以在浏览器中查看。
该命令一般不会被使用。原因是因为有更好可以替代的工具。
jstack
命令用于生成虚拟机当前时刻的线程快照。线程快照指的是当前虚拟机内的每一条线程正在执行的方法堆栈的集合,生成线程快照的作用是,可用于定位线程出现长时间停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等问题,当线程出现停顿时 就可以用jstack各个线程调用的堆栈情况。
jstack命令格式:
jstack [option] vmid
常用的option选项有:
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
示例:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有