文章摘要
前一阵接口服务性能调优的时候,零零星星地用到一些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++的堆栈