目录
虚拟机性能监控、故障处理
一、虚拟机相关命令
1、jps:虚拟机进程状况工具
功能与Linux中的ps命令相似,可用列出正在运行的虚拟机进程,以及进程的唯一ID
命令格式:jps [options] [hostid]
示例:
2、jstat:虚拟机统计信息监视工具
是用于监视虚拟机各个运行状态信息的命令工具。展示Java进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
命令格式:
jstat [option pid [interval[s|ms]] [count]]
jstat [-命令选项] [pid] [间隔时间/毫秒] [查询次数]
常用选项:
-class: 监视类加载、卸载数量、总空间以及类装载所耗费时间
-gc: 监视Java堆情况,包括Eden区,2个Survivor区,老年代,永久代等容量,已用空间,垃圾收集时间合计等
-gcutil: 监视内容与-gc基本相同,单输出主要是关注Java堆各个区域使用的最大最小空间
参数详解:
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC :年轻代中Eden(伊甸园)的容量 (字节)
EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC :Old代的容量 (字节)
OU :Old代目前已使用空间 (字节)
MC:metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
示例:
打印进程id是6132的相关信息,每1000ms打印一次,打印10次。
3、jinfo:Java配置信息工具
是实时查看和调用虚拟机各项参数。
命令格式:
jinfo [option] pid
示例:
我在JpsTest程序添加了-XX:CMSInitiatingOccupancyFraction=85 启动参数
4、jmap:Java内存映像工具
用于生成堆转储快照(dump文件)。如果不用jmap命令,也可以通过-XX:+HeapDumpOnOutMemoryError参数来让虚拟机在内存溢出异常出现后自动生成堆转储快照文件。
命令格式:jmap [option] pid
常用选项:
-dump:生成Java堆转储快照。格式为 -dump:[live,]format=b,file=<filename>,其中live子参数说明是否只dump出存活的对象。例:jmap -dump:format=b,file=dumpFile.bin <pid>
-heap:显示Java堆详细信息。注:只在linux、Solaris平台下有效。
-histo:显示堆中对象统计信息,包括类、实例数量、合计容量
示例:
5、jhat:虚拟机堆转储快照分析工具
与jamp搭配使用,是用来分析jmap生成的堆转储快照。jhat内置了一个小型的服务器,生成堆转储快照的分析结果后,可以直接在浏览器中查看。
命令格式:jhat <filename>
屏幕显示"Server is ready."后在浏览器中输入,http://localhost:7000/ 即可看到分析结果。
注:有一说一,这个结果看着也不是很直观。我平时用的比较偏多的还是jamp中的-histo,看着比较直观一些。
示例:
6、jstack:Java堆栈跟踪工具
用于生成当前Java进程当前时刻的线程快照。线程快照就是当前虚拟机内所有线程正在执行的方法堆栈的集合。经常用来排查线程死锁,死循环,线程长时间阻塞等问题。
命令格式:
jstack [option] pid
常用选项:
-l:除堆栈信息外,还会显示关于锁的附加信息。也可以输出到相应文件,例:jstack -l <pid> > stack.log
-F:当正常输出请求没有反映时,该选项可以强制输出线程堆栈信息。
由于我linux服务器上没有运行Java程序,所以示例都是在window上的。
除了上面介绍的几种,还有很多其他的工具。
如:jar(创建和管理jar文件),java(Java运行工具),javac(Java编译器),javap(字节码分析工具)等等。
感兴趣的小伙伴可以深入了解一波,顺便给我也分享一波。
示例:
stack.log文件中,相关线程信息也有打印
二、可视化故障处理工具
1、JConsole:Java监控与管理控制台
是基于JMX的可视化监控、管理工具。主要功能是通过JMX的MBean对系统进行信息收集和参数动态调整。
该工具在我们安装jdk的bin目录下,可以看到有个jconsole.exe文件。
打开该工具,当我们有Java程序运行时,他会自动检测到本机的Java进程,然后我们选择相应的进程,就可以进入可视化的界面查看相应信息。
主要有内存、线程、类加载数、VM概要、MBean几大块信息。有兴趣可以自己在电脑上运行一个Java程序,然后自己点一点,看一看。
内存监控:相当于将我们之前介绍的jstat命令给可视化了。用于监视被收集器管理的虚拟机内存的变化趋势。
线程监控:相当于将我们之前介绍的jstack命令给可视化了。用于监测Java进程线程运行情况。还很贴心的有个专门检测死锁的按钮哦。
2、VisualVM:故障处理集合工具
是一个功能强大的运行监视和故障处理程序之一。除了常规的运行监视、故障处理外,还有着性能分析等工具。
功能:
1)显示Java进程以及进程的相关配置环境信息,相当于jps,jinfo。
2)监视应用程序的处理器,垃圾收集,堆,线程等信息,相当于jstas,jstack
3)dump以及分析堆转储快照,相当于jmap,jhat
4)程序运行性能的分析
5)可以安装插件,可以扩展更多功能
离线官方插件地址:https://visualvm.github.io/pluginscenters.html
在线java visualvm安装插件。如图:
在Profiler页中,可以查看运行期间方法级的处理器执行时间分析以及内存分析。
Btrace动态日志跟踪,这是一个VisualVM的插件,功能很强大。可以在不中断目标程序运行的情况下,通过HotSpot虚拟机允许在不停机的情况下跟新加载类的代码功能,动态加入原本不存在的调试代码。
当程序出现异常问题时,可以通过该插件,来增加一些调试的日志代码,而且不同停掉服务。
JMC(Java Mission Control):可持续在线监控工具
用来远程监控和管理JVM虚拟机的。
需要在远程端的服务进程启动时添加如下参数即可远程:
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.31.31
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
然后在VisualVM工具中,选择"文件"->"添加远程主机",填上我们配置的地址和端口接口连接上。后续的操作于本地一致。
在我们平时的开发过程中,Linux服务器使用的较多,因此相对于可视化的界面,我个人认为相关的虚拟机命令使用的要更多一些。