jvm 性能监控、故障处理工具

本文总结下jvm常用的排查问题的工具,包括jps、jstat、jinfo、jmap、jhat、jstack以及可视化管理工具Jconsole等。生产环境中,遇到问题时,可以用来参考。

JDK本身自带了较多的工具可以使用,下面是windows版本,linux版本的工具也是同样的,
在这里插入图片描述
准备
我们先创建一个springboot项目,然后打包放到linux环境中运行,具体参考之前文章《发布springboot项目jar war 到linux服务器》

本文demo运行的是jar包,下面介绍常用的命令行工具。

一、jps 输出java进行列表

jps(JVM Process Status),取名和功能都类似UNIX的ps命令。可以列出正在运行的虚拟机进程。

1. 命令格式:

jps [ option ] [ hostid ]

2. 示例:

jps -l
在这里插入图片描述

3. 命令汇总:

命令 作用
-l 输出java进行号和主类全名,如果进行执行的是jar包,则输出jar包路径
-q 只输出进行号列表
-m 输出进行启动时传给主类main()函数的参数
-v 输出虚拟机进程启动时的jvm参数

二、jstat 输出运行时垃圾收集等信息

jstat(JVM Statistics Monitoring Tool),用于监视jvm各种运行状态信息的命令行工具。可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。

1. 命令格式
jstat [option vmid [ interval [s/ms] [count] ] ]

2.示例:

jstat -gc 1329 250 20
查询进程号是1329的垃圾收集情况,每250ms收集一次,总共20次。如果不写时间间隔和次数,默认表示查询1次。
在这里插入图片描述
参数说明:

参数 含义
S0C 第一个survivor(幸存)区的大小
S1C 第二个survivor(幸存)区的大小
S0U 第一个survivor(幸存)区已经使用的大小
S1U 第二个survivor(幸存)区已经使用的大小
EC/EU Eden区大小/已使用大小
OC/OU old区大小/已使用大小
MC/MU 方法区大小/已使用大小
CCSC/CCSU 压缩类空间大小/已使用大小
YGC/YGCT YongGC次数/YongGC耗时(秒)
FGC/FGCT FullGC次数/FullGC耗时(秒)
GCT 垃圾回收总的消耗时间(秒)

3.命令汇总

选项 作用
-class 输出类加载、卸载数量、总空间以及类装载所消耗的时间
-gc 显示Java堆状况,包括Eden区、两个survivor区、老年代、方法区的容量等
-gccapacity 与-gc类似,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil 与-gc基本相同,主要关注堆区各区域使用的百分比大小
-gccause 与-gcutil功能一样,但是会输出导致上一次垃圾收集产生的原因
-gcnew 监视新生代垃圾收集情况
-gcnewcapacity 与-gcnew基本相同,但主要输出新生代使用到的最大和最小空间
-gcold 监视老年代垃圾收集情况
-gcoldcapacity 与-gcold基本相同,但主要输出老年代使用到的最大和最小空间
-compiler 输出即时编译器编译过的方法、耗时信息
-printcompilation 输出已经被即时编译的方法

三、jinfo 实时查看和调整虚拟机参数

jinfo(Confiuration Info for Java)的作用是实时查看和调整虚拟机的各项参数。

1. 命令格式:

jinfo [option] pid

2. 示例:

查询CMSInitiatingOccupancyFraction参数值,

jinfo -flag CMSInitiatingOccupancyFraction 1329
在这里插入图片描述

四、Jmap java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般成为heapdump或者dump文件)。

1.命令格式:

jmap [option] pid

2.示例:

dump堆信息到demodump.bin二进制文件中,
在这里插入图片描述
3. 命令汇总:

选项 作用
-dump 生成java堆转储快照。格式为-dump:[live,]format=b,file= ,其中live子参数说明是否只dump存活的对象
heap 显示java堆详细信息,比如使用哪种回收器,参数配置,分代状况等。只在linux/solaris平台下有效
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalizer方法的的对象。只在linux/solaris平台下有效
-histo 显示java堆详细信息,包括类、示例数量、合计容量
-permstat 以ClassLoader为统计口径显示永久代内存状态,只在linux/solaris平台下有效
-F 当虚拟机进程堆-dump选项没有响应时,强制生成dump快照,只在linux/solaris平台下有效

五、jhat 虚拟机转储快照分析工具

jhat(JVM Heap Analysis Tool),与jmap搭配使用,用来分析jmap生成的堆转储快照文件内容。但是在实际工作中,不建议使用这个工具,可以选择其他可视化工具进行离线分析。

我们使用jma命令dump出来的文件demodump.bin文件为例,使用jhat命令,然后如下:
在这里插入图片描述
等待显示了Server is ready之后,使用浏览器访问http://ip地址:7000,显示如下:
在这里插入图片描述
页面默认显示【All classes including platform】,
拖到页面最底部,可以发现还有其他类型的页面功能:
在这里插入图片描述
翻译过来如下:

  • 显示堆中所有的类
  • 显示根集能引用的对象
  • 显示所有类的实例对象,包含platform的
  • 显示所有类的实例对象,除去platform的
  • 显示堆实例分布表
  • 显示最终摘要
  • 使用对象查询语言查询,具体语法可以使用页面上方的【OQL Help】帮助

六、jstack java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般成为ThreadDump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合,生成快照的目的一般都是用于定位线程出现长时间的停顿原因,比如死锁、死循环、阻塞等。

1.命令格式:

jstack [option] pid

2.示例:
jstack -l 1329
在这里插入图片描述
或者使用jstack -l 1329 >>文件名.txt ,直接打印到txt文件中,然后离线分析。

3.命令汇总:

选项 作用
-l 除了堆栈外,显示锁的附件信息
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-m 如果调用到本地方法的话,可以显示C/C++的堆栈

七、JCconsole java监视与管理控制台

JConsole(Java Monitoring and Managermen Console)是一款基于JMX(Java Managemen Extensions)的可视化监视、管理工具。

直接在windows版的jdk/bin目录下,运行jconsole.exe ,
在这里插入图片描述
Jconsole会直接扫描而本地虚拟机进程,比如我用idea在本地跑的DemoApplicaton,可以选择直接连接;
也可以选择连接远程进程,比如linux上跑的服务。
这里直接选择本地进程,显示如下:
在这里插入图片描述

八、VisualVM 多合一故障处理工具

VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一。

具有功能:

  • 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo);
  • 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack);
  • dump以及分析堆转储快照(jmap、jhat);
  • 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法;
  • 离线程序快照:收集程序运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者进行bug反馈。
  • 使用其他插件来扩展功能。

此工具同样在jdk/bin目录下,直接运行jvisualvm.exe文件。上文中使用jmap工具dump出来的demodump.bin文件,使用jvisualvm就可以打开分析。

【文件】->【装入】,选择堆dump文件,打开如下:
在这里插入图片描述

发布了62 篇原创文章 · 获赞 29 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csdn_20150804/article/details/105329004