JDK命令行工具

文章摘要

前一阵接口服务性能调优的时候,零零星星地用到一些JDK自带的命令行工具。当服务部署到生产环境时,有一些性能诊断工具因为环境原因可能会受到限制,但是通过使用这些JDK自带的监控工具,我问可以直接在应用程序中实现强大的监控分析功能。这些工具在《深入理解Java虚拟机》《Java性能权威指南》中都有系统性的介绍,本文也权当是一篇学习笔记,顺便对之前调优过程中的使用做一下梳理。

常用的JDK命令行工具

请求ID 主要作用
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,显示虚拟机的线程快照
jcmd 打印Java进程所涉及的基本类、线程和VM信息
jconsole 提供JVM活动的图形化视图,包括线程的使用、类的使用和GC活动
jvisualvm 监控JVM的GUI工具,可用来剖析运行的应用,分析JVM堆转储

这些工具可以广泛用于以下领域:

  • 基本的VM信息
  • 线程信息
  • 类信息
  • 实时GC分析
  • 堆转储的事后处理
  • JVM的性能分析

常用命令介绍

jps

命令格式

jps [ options ] [ hostid ]

options

-q 只输出本地虚拟机进程ID,省略主类名

-m 输出虚拟机进程启动时传递给main()函数的参数

-l 输出进程执行的主类的全名

-v 输出虚拟机进程启动时的JVM参数

jstat

命令格式

jstat [ option vmid [interval[s|ms] [count]] ]

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编译的方法

jinfo

命令格式

jinfo [ option ] pid

jmap

命令格式

jinfo [ option ] vmid

options

-dump 生成Java堆转储快照,格式为: -dump:[live , ]format=b , file=,其中live子参数 说明只dump出存活的对象

-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象

-heap 显示Java堆详细信息,如使用哪种回收器,参数配置,分代状况等

jhat

命令格式

jhat heapdumpFileName

jatack

命令格式

jstack [ option ] vmid

options

-F 当正常输出的请求不被响应时,强制输出线程堆栈

-l 除堆栈外,显示关于锁的附加信息

-m 如果调用到本地方法的话,可以显示C/C++的堆栈