概述:JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,接下来逐一对各种工具作一介绍:
1.jps
这个名字是Java Virtual Machine Process Status Tool的缩写
作用:用于输出jvm内存状态信息
语法:
jps [options] [hostid]
说明:
①、options:命令选项,用来对输出格式进行控制,jps命令选项如下:
-q 不输出类名、Jar名和传入main方法的参数
使用示例:
-m 输出传入main方法的参数
示例:
-l 输出main类或Jar的全限名
示例:
-v 输出传入JVM的参数
示例:
②、hostid:指定监控主机,默认为当前主机;
2.jmap
作用:监控内存内的Java对象
语法:
jmap [option]
说明:pid 为 进程的id 数字为第一个示例中的模式
此时我的电脑中有这些进程:
我随意挑选一个进程进行示例
option:命令选项,常用选项如下:
①.-heap 印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
②.-histo[:live] 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象:
输入格式为 jmap -histo:live 27792(统计活着的对象)
jmap -histo 27792 (获取所有对象)
我的输出格式是这样的 这个里面活着的对象有点多所以无法全部截图(这时我执行的是jmap -histo:live 27792)
标准输出范例:
class name列出现了[C、[B、[L等很奇怪的内容,这些属于非自定义类,具体为:
BaseType Character |
Type |
Interpretation |
B |
byte |
signed byte |
C |
char |
Unicode character |
D |
double |
double-precision floating-point value |
F |
float |
single-precision floating-point value |
I |
int |
integer |
J |
long |
long integer |
L; |
reference |
an instance of class |
S |
short |
signed short |
Z |
boolean |
true or false |
[ |
reference |
one array dimension |
③.-finalizerinfo 打印等待回收的对象信息
如下命令:jmap -finalizerinfo 27792
Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象
④. -dump:
dump-options选项:
live 只输出活着的对象;不指定,则输出堆中所有对象
format=b 指定输出格式为二进制
file=
-F 与-dump:
输出的文件是这样的:
输入如下:jmap -dump:live,format=b,file=D:\heap.bin 27792
3.jhat 作用:用于分析产生的堆文件,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
使用过程:
①.导出堆文件
输入如右:jmap -dump:live,file=D:\heap.log pid 27792
②.分析堆文件
输入格式:jhat -J-Xmx512m
说明:有时dump出来的堆文件很大,在启动时报堆空间不足的错误,可添加-J-Xmx512M参数;
如下输入:jhat -J-Xmx512M D:\heap.log
输出这样的结果
我们可以看到下方有一个端口号:7000
也就是说 我们可以通过访问-----127.0.0.1:7000 来查看解析后的堆文件(格式为html)
如下效果
拉到最后我们可以看到这些东西
说明:
All classes including platform 显示所有创建堆中对象的类
Show all members of the rootset 显示rootset能引用到的所有对象
Show instance counts for all classes (including platform) 显示所有类(包括JDK中定义的Java类)的实例数量
Show instance counts for all classes (excluding platform) 显示所有类(不包括JDK中定义的Java类)的实例数量
Show heap histogram 显示堆内对象直方图
Show finalizer summary 显示等待回收的对象信息
Execute Object Query Language (OQL) query 执行对象查询语句