您的位置:首页 > 运维架构

JVM性能监控与内存分析工具——命令行工具(1)

2016-11-17 14:57 686 查看

前言

经常使用适当的虚拟机监控和内存分析工具可以加快我们分析数据、定位解决问题的速度。目前市场上有许多强大的Java性能监控工具,但是在JDK的bin目录中其实包含了许多小巧的分析工具,并且这些工具也非常稳定,能在分析应用程序性能、定位解决故障时发挥巨大的作用。

本文所介绍的工具全部是基于Windows系统下的JDK 1.8,如果版本、操作系统不同,工具所支持的功能可能会有所差别。另外由于这些工具都是存放在JDK的bin目录下,所以为了能在命令行中直接使用这些命令,需要将%JAVA_HOME%\bin添加到PATH环境变量的路径中。

jps:虚拟机进程状况工具

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程的命令,并且可以显示虚拟机执行主类名称(main(函数所在的类))以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier, LVMID)。

这个命令简单实用,并且其他的JDK工具都需要这条命令所查询到的LVMID来确定要监控的虚拟机进程。对于本地虚拟机来说,LVMID与操作系统的进程PID是一致的,但是如果同时启动了多个虚拟机进程,无法根据进程名称定位时,那就只能通过jps显示主类的功能才能区分。

jps命令格式:jps [options ] [hostid]

jps执行结果:

PS C:\Profile\Tools> jps -l
1816
6072 sun.tools.jps.Jps
8168 C:\Profile\Tools\SoapUI-5.2.1\bin\SoapUI-5.2.1.exe


其中-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名,其他常用选项还有

选项功能
-v输出传递给JVM的参数
-m输出传递给main 方法的参数
-q只显示LVMID,不显示class名称,jar文件名和传递给main 方法的参数

jstat:虚拟机统计信息监控工具

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具,而且主要集中在分析JVM内存的GC状况。

jstat命令格式为:jstat [ option vmid [interval[s|ms] [count]] ]

由于jstat命令也可以查询远程虚拟机进程中的JVM内存状态,所以在查询远程虚拟机进程时,那VMID的格式是:

[protocol: ] [//] lvmid [@hostname[:port]/servername]

参数interval和count代表查询间隔和次数,缺省值为查询一次。假设需要每200毫秒查询一次10684进程垃圾收集状况,一共查询10次,此时命令如下:

jstat -gc 10684 200 10

选项option代表用户查询类型,主要分为装载类、垃圾收集、运行期编译状况这三类,主要用到的参数如下表所示

选项功能
-class监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆状况
-gccapacity监视内容与-gc基本相同,主要关注各个区域使用到的最大、最小空间
-gcutil监视内容与-gc基本相同,主要关注已使用空间所占百分比
-gccause会额外输出导致上一次GC产生的原因
-compiler输出JIT编译器编译过的方法、耗时等信息
下面以最常用的-gcutil参数为例,输出结果如下所示

PS C:\Profile\Tools> jstat -gcutil 10684
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00   0.00   6.00   0.00  17.43  19.76      0    0.000     0    0.000    0.000


因为我例子是一个很简单的程序,所以并没有使用什么内存,其中输出参数代表如下:

S0: Survivor space 0 已使用空间的百分比

S1: Survivor space 1 已使用空间的百分比

E: Eden space 已使用空间的百分比

O: Old space 已使用空间的百分比

M: Method space 已使用空间的百分比,其实这个也称作永久代,所以有的JDK版本会用P来表示

CCS:Compressed class space已使用空间的百分比

YGC: Young GC 的次数

YGCT: Young GC 所用的时间 单位秒

FGC: Full GC 的次数

FGCT: Full GC 所用的时间 单位秒

GCT: 用于垃圾回收的总时间 单位秒

jinfo:Java配置信息工具

jinfo(Configuration Info for Java)可以用来实时地查看未被显示指定的参数的系统默认值,甚至可以用来调整这些参数值。

jinfo命令格式: jinfo [option] pid

下面例子是使用-sysprops选项把虚拟机进程的System.getProperties()的内容打印出来

PS C:\Profile\Tools> jinfo -sysprops 1324
Attaching to process ID 1324, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.102-b14
sun.boot.library.path = C:\Profile\Tools\Java\jdk1.8.0_102\jre\bin
user.country.format = CN
java.vendor.url = http://java.oracle.com/ java.vm.vendor = Oracle Corporation
path.separator = ;
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = Service Pack 1
sun.java.launcher = SUN_STANDARD
user.script =
user.country = US
user.dir = C:\Profile\Tools\Java\Workspace\Practice
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_102-b14
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = C:\Profile\Tools\Java\jdk1.8.0_102\jre\lib\endorsed
line.separator =
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm java