文章目录
第四章、虚拟机性能监控和故障处理工具
使用适当的虚拟机监控和分析工具可以加快我们分析数据、定位解决问题的速度。
这里的数据包括:运行日志、异常堆栈、GC 日志、线程快照(threaddump / javacore 文件)、堆转储快照(headdump / hprof 文件)等数据
一、JDK的命令行工具
每逢 JDK 个更新版本之时,bin 目录下命令行工具的数量和功能总会不知不觉地增加和增强。这些命令行工具大多数是 jdk/lib/tools.jar 类库的一层薄包装而已,它们主要的功能代码是在 tools 类库中实现的。
在Windows中是.exe文件。
名称 | 主要作用 |
---|---|
jps | 显示指定系统内所有的HotSpot虚拟机进程 |
jstat | 用于收集HotSpot虚拟机各方面的运行数据 |
jinfo | 显示虚拟机配置信息 |
jmap | 生成虚拟机的内存存储快照(heapdump文件) |
jhat | 用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果 |
jstack | 显示虚拟机的线程快照照片 |
1、jps:显示所有虚拟机进程
可以列出正在执行的虚拟机进程,并显示虚拟机执行主类名以及这些进程的本地虚拟机唯一ID。
jsp命令格式:
- jps [options] [hostid]
从上图可以看出主类名是Test,进程号为5859。
jps 可以通过 RMI协议查询开启了 RMI 服务器的远程虚拟机进程状态,hostid 为 RMI 注册表中注册的主机名。
jps -v
2、jstat:虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI 图形界面,只提供纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
jstat监视选项众多,需要用时再具体查找指定的参数选项。
jstat命令格式:
jstat [option vmid [interval[s|ms] [count]]]
interval和count表示查询间隔和次数,去掉的话表示只查询一次。
如果是远程的话,vmid的格式应当为:
[protocol:][//]lvmid[@hostname[:port]/servername]
查询结果表明:这台服务器的新生代 Eden 区(E,表示 Eden)使用了 7.73% 的空间,两个 Survivor 区(S0、S1,表示 Survivor0、Survivor1)里面都是空的,老年代(O,表示 Old)和永久代(M,表示 Permanent)则分别使用了 33.34% 和 98.05 的空间。程序运行以来共发生 Minor GC(YGC,表示 Young GC)13 次,总耗时 0.152 秒,发生 Full GC(FGC,表示 Full GC)2此,Full GC 总好耗时(FGCT,表示 Full GC Time)为 0.175秒,所有 GC 总耗时(GCT,表示 GC Time)为 0.327秒。
3、jinfo:Java配置工具
jinfo作用是实时查看和调整虚拟机各项参数。使用jps -v可以查看虚拟机启动时显式指定的参数列表。但是想知道未被显式指定的参数,就可以使用jinfo -flag查看或者使用-XX:+PrintFlagsFinal查看参数默认值也是一个很好的选择。
4、jmap:Java内存映射工具
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。如果不使用 jmap 命令,要想获取 Java 堆转储快照,还有一些比较“暴力”的手段:譬如前面用过的-XX:+HeapDumpOnOutOfMemoryError 参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件,通过 -XX:+HeapDumpOnCtrlBreak 参数则可以使用 [Ctrl]+[Break] 键让虚拟机生成 dump 文件,又或者再 Linux 系统下通过 Kill -3 命令发送进程退出信息“吓唬”一下虚拟机,也能拿到 dump 文件。
jmap的作用不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息。如空间使用率、当前用的什么收集器等。
jmap格式命令:
jmap [option] vmid
参数含义查看书P107
jstack:Java 线程堆栈跟踪工具
jstack主要用来查看某个Java进程内的线程堆栈信息。
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或者 javacore 文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
jstack 命令格式:
jstack [option] pid
二、JDK可视化工具
JConsole:Java 监视与管理控制台
启动JConsole
JDK/bin目录下“jconsole.exe"启动JConsole后,连接需要监视的虚拟机进程就可以进行监控。
2、VisualVM:多合一故障处理工具
VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随 JDK 发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。测试代码: