虚拟机性能监和故障处理

概述

实际项目中,定位问题往往需要依赖工具,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

1
jps -lv 127.0.0.1 //输出127.0.0.1机器上的java进程,显示jvm参数,显示完全的包名,主类名,jar完全路径,127.0.0.1主机要启动jstatd

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来查看个线程的调用堆栈,可知道没有响应的线程到底在后台做了些什么事情,或者等待什么资源。

1
2
3
jstack pid
jstack pid | grep thread-id

JDK的可视化工具

JConsole

JConsole为监控虚拟机提供了可视化的界面,其中包括内存监控(jstat),线程监控(jstack等,并且在界面还可以检测死锁

VisualVM

ALL in one Java Troubleshooting Tool, 它是随着JDK版本发布功能最强大的虚拟机故障处理工具,它的最大的优点是不需要被监视的程序基于特殊的Agent运行,因此它对实际性能影响很小,可直接应用在生产环境中。