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