概述
实际项目中,定位问题往往需要依赖工具,JVM虚拟机运行时生成很多数据,其中包括:运行图纸,异常堆栈,GC日志,线程快照,堆转储快照等,使用工具对这些数据进行分析,有利于加快定位问题的速度。
JDK命令行工具
jps:虚拟机进程状况工具
jps(JVM Process Status Tool), 可列出正在运行的虚拟机进程,并显示虚拟机执行的主类名称,以及这些进程的本地虚拟机唯一的ID。这个ID与操作系统的进程ID是一致的。
jps [options] [hostid]
选项:
-q 仅仅输出出VM标识符,即ID
-m 输出main methiod的参数
-l 输出完全的包名,应用主类名,jar的完全路径名
-v 输出jvm参数
-V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
-Joption 传递参数到vm,例如:-J-Xms48m
|
|
jstat:监控虚拟机各种运行状态信息的命令行工具
jstat: JVM Statistics Monitoring Tool, 它可以显示本地或远程虚拟机进程中类装载、内存、垃圾收集和JIT编译等运行数据,无GUI下的首选。
jstat [generalOption|outputOptions vmid [interval[s|ms][count]]]
命令比较复杂,常用的是如下:
jstat -class pid: 显示加载class的数量,所占空间等信息
jstat -compiler pid: 显示VM实时编译的数量等信息
jstat -gc pid: 显示gc的信息,查看jc的次数和时间,其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity: 显示VM中三代(yong,old, perm)对象使用和占用大小
jstat -util pid:统计gc信息统计
jinfo:Java配置信息工具
jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机的各项参数配置信息等
- jinfo -sysprops pid 键值对形式打印Java系统属性
jmap:Java内存映像工具
jmap(Memory Map for Java)用于生成堆转储快照(heapdump或dump文件),除此之外,它还可查询finalize队列,Java堆和永久代的详细信息,空间使用率,当前是哪种收集器等
jmap -dump pid 生成堆转储快照
jmap -finalizerinfo pid 显示在F-Queue中等待Finalizer线程执行的finalize方法对戏
jmap -heap pid 显示Java堆的详细信息,使用何种回收器,参数配置,分代状况等
jmap -histo pid 显示堆中的对象统计信息,包括类,实例数量和合计容量
jstack: Java堆栈跟踪工具
jstack(Stack Trace for Java)该命令用于生成虚拟机当前时刻的线程快照,主要用来定位线程出现长时间停顿的原因,如线程发生死循环,死锁,请求外部资源导致的长时间等待,可通过jsatck来查看个线程的调用堆栈,可知道没有响应的线程到底在后台做了些什么事情,或者等待什么资源。
|
|
JDK的可视化工具
JConsole
JConsole为监控虚拟机提供了可视化的界面,其中包括内存监控(jstat),线程监控(jstack等,并且在界面还可以检测死锁
VisualVM
ALL in one Java Troubleshooting Tool, 它是随着JDK版本发布功能最强大的虚拟机故障处理工具,它的最大的优点是不需要被监视的程序基于特殊的Agent运行,因此它对实际性能影响很小,可直接应用在生产环境中。