虚拟机性能监控与故障处理工具

本篇介绍了随JDK发布的6个命令行工具(jps、jstat、jinfo、jmap、jhat和jstack)与2个可视化故障处理工具(JConsole和VisualVM)。
1.JDK命令行工具
JDK/bin目录下的命令行工具大多数是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库中实现的。
JDK主要命令行监控工具:
这里写图片描述
1.1 jps(JVM Process Status Tool):虚拟机进程状况工具
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(main()函数所在类)的名称,及这些进程的本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier)。
对于本地虚拟机进程,LVMID与操作系统的进程ID(PID)是一致的。

1、jps命令格式:jps [options] [hostid]
2、//例:
3、E:\program\Java\jdk1.8.0_45\bin>jps -1
4、9528 sun.tools.jps.Jps
5、//jps可以通过RMI协议查询开启了RMI服务远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。

这里写图片描述
1.2 jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具
可以显示本地或远程(需远程主机提供RMI支持)虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据它是服务器上运行期定位虚拟机性能问题的首选工具。

1、jstat命令格式:jstat [ option vmid [interval[s|ms] [count]] ]
2、//参数interval代表查询间隔;count代表查询次数。若省略,则只查询一次
3、例:需要每250毫秒查询一次进程2764垃圾收集状况,共查询20次:
4、jstat -gc 2764 250 20
5、//如果是本地虚拟机进程,VMID与LVMID是一致的;如果是远程虚拟机进程,那
6、//VMID格式应为:[protocol:][//] lvmid[@hostname[:port]/servername]

选项option代表希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况。
这里写图片描述
例子:服务器内存状况
这里写图片描述
解释:新生代Eden区(E)使用了6.2%空间;Survivor区(S0、S1)里面都为空;老年代(O);永久代(P);
程序运行以来共发生Minor GC(YGC,表示Young GC)16次,总耗时(YGCT)0.105秒;FGC(Full GC);
所有GC总耗时(GCT)0.577秒。
1.3 jinfo(Configuration Info for Java):Java配置信息工具
作用:实时查看和调整虚拟机各项参数。
jps的-v参数可以查看虚拟机启动时显示指定的参数列表。若想知道未被显示指定的参数的系统默认值,除去找资料外,只能使用jinfo的-flag选项进行查询;jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties( )内容打印出来。
JDK1.6之后,jinfo在Windows和Linux平台都有提供,并加入了运行期修改参数能力,可用-flag [+|-]name或-flag name=value修改一部分运行期可写的虚拟机参数值。

1、jinfo命令格式:jinfo [option] pid
2、//例:查询CMSInitiatingOccupancyFraction参数值
3、// jinfo -flag CMSInitiatingOccupancyFraction 1444

1.4 jmap(Memory Map for Java): Java内存映像工具
用于生成堆转储快照(一般称为heapdump或dump文件)。还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前所用收集器种类等。
与jinfo命令一样,不少功能在Windows平台下受限。

1、jmap命令格式: jmap [option] vmid

这里写图片描述
1.5 jhat(JVM Heap Analysis Tool):虚拟机堆转储快照分析工具
与jmap搭配使用来分析jmap生成的堆转储快照。
jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可在浏览器中查看。
分析工作是一个耗时且消耗硬件资源的过程。
1.6 jstack(Stack Trace for Java):Java堆栈跟踪工具
用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。
线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿时,通过jstack来查看各线程的调用堆栈,可知道未响应的线程在后台做什么事,或等待什么资源。

1、jstack命令格式: jstack [option] vmid

option选项合法值与具体含义如下表:
这里写图片描述
2.JDK的可视化工具
JDK中除了提供大量命令行工具,还有两个功能强大的可视化工具:JConsole和VisualVM。
JConsole是JDK1.5时期已经提供的虚拟机监控工具,VisualVM在JDK1.6 Update7中才首次发布。
2.1JConsole:Java监视与管理控制台
JConsole是基于JNX的可视化监视与管理的工具。它管理部分的功能是针对JMX MBean进行管理。
2.1.1启动 JConsole
JDK/bin目录下的“jconsole.exe”(实现jps功能)。
2.1.2内存监控
”内存“页签相当于可视化的jstat命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势。
2.1.3线程监控
”线程“页签相当于jstack命令,遇到线程停顿时可用此页签进行监控分析。
2.2VisualVM:多合一故障处理工具
VisualVM是到目前为止,随JDK发布的功能最强大的运行监视和故障处理程序,并且不需要被监视的程序基于特殊Agent运行。
2.2.1VisualVM兼容范围与插件安装
VisualVM基于NetBeans平台开发,因此具备插件扩展功能的特性。
安装插件:工具—>插件—>可用插件
2.2.2分析程序性能
Profiler页签中提供了程序运行期间方法级的CPU执行时间分析及内存分析,会对程序运行性能有比较大的影响。
1)CPU分析:统计每个方法的执行次数、执行耗时;
2)内存分析:统计每个方法关联的对象数及这些对象所占的空间。
!!JDK1.5之后,进行Profiler前,最好在被监视的程序中使用-Xshare:off参数来关闭类共享优化

 

JPS失效处理

现象: 用ps -ef|grep java能看到启动的java进程,但是用jps查看却不存在该进程的id。待会儿解释过之后就能知道在该情况下,jconsole、jvisualvm可能无法监控该进程,其他java自带工具也可能无法使用

分析: jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题

原因

(1)、磁盘读写、目录权限问题 若该用户没有权限写/tmp目录或是磁盘已满,则无法创建/tmp/hsperfdata_userName/pid文件。或该文件已经生成,但用户没有读权限

(2)、临时文件丢失,被删除或是定期清理 对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。这也是我第一次碰到该现象的原因。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等

这个导致的现象可能会是这样,用jconsole监控进程,发现在某一时段后进程仍然存在,但是却没有监控信息了。

(3)、java进程信息文件存储地址被设置,不在/tmp目录下 上面我们在介绍时说默认会在/tmp/hsperfdata_userName目录保存进程信息,但由于以上1、2所述原因,可能导致该文件无法生成或是丢失,所以java启动时提供了参数(-Djava.io.tmpdir),可以对这个文件的位置进行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,这是我第二次碰到该现象的原因

附:

1.如何给main传递参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在Program arguments中写下要传的参数值

1.如何给JVM传递参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在VM arguments中写下要传的参数值(一般以-D开头)

 

posted on 2018-09-27 10:10  五光十色  阅读(180)  评论(0编辑  收藏  举报

导航