概述: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方法的参数

使用示例:

windows监控cpu与内存性能命令 cpu内存监控工具_windows监控cpu与内存性能命令

 

-m 输出传入main方法的参数

示例:

windows监控cpu与内存性能命令 cpu内存监控工具_Java_02

-l 输出main类或Jar的全限名

示例:

windows监控cpu与内存性能命令 cpu内存监控工具_main方法_03

 

-v 输出传入JVM的参数

示例:

windows监控cpu与内存性能命令 cpu内存监控工具_Java_04

 

②、hostid:指定监控主机,默认为当前主机;

2.jmap

作用:监控内存内的Java对象

语法:

 

jmap [option] <pid>

说明:pid 为 进程的id 数字为第一个示例中的模式

此时我的电脑中有这些进程:

windows监控cpu与内存性能命令 cpu内存监控工具_windows监控cpu与内存性能命令_05

我随意挑选一个进程进行示例

option:命令选项,常用选项如下:

①.-heap 印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;

windows监控cpu与内存性能命令 cpu内存监控工具_Java_06

②.-histo[:live] 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象:

输入格式为 jmap -histo:live 27792(统计活着的对象)

jmap -histo 27792 (获取所有对象)

我的输出格式是这样的 这个里面活着的对象有点多所以无法全部截图(这时我执行的是jmap -histo:live 27792)

windows监控cpu与内存性能命令 cpu内存监控工具_输出格式_07

 

标准输出范例:

windows监控cpu与内存性能命令 cpu内存监控工具_main方法_08

   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

windows监控cpu与内存性能命令 cpu内存监控工具_输出格式_09

Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象

④. -dump:<dump-options> 以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看;

dump-options选项:

live 只输出活着的对象;不指定,则输出堆中所有对象

format=b 指定输出格式为二进制

file=<file> 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=D:\heap.bin <pid>

 -F 与-dump:<dump-options> <pid>或-histo<pid>一起使用,当<pid>没有响应时,强制执行;注意:不支持live子选项

输出的文件是这样的:

输入如下:jmap -dump:live,format=b,file=D:\heap.bin 27792

windows监控cpu与内存性能命令 cpu内存监控工具_windows监控cpu与内存性能命令_10

3.jhat 作用:用于分析产生的堆文件,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

使用过程:

①.导出堆文件

输入如右:jmap -dump:live,file=D:\heap.log pid 27792

windows监控cpu与内存性能命令 cpu内存监控工具_main方法_11

②.分析堆文件

输入格式:jhat -J-Xmx512m <heap dump file> 解析Java堆转储文件,并启动一个 web server;

说明:有时dump出来的堆文件很大,在启动时报堆空间不足的错误,可添加-J-Xmx512M参数;

如下输入:jhat -J-Xmx512M D:\heap.log

输出这样的结果

windows监控cpu与内存性能命令 cpu内存监控工具_Java_12

我们可以看到下方有一个端口号:7000

也就是说 我们可以通过访问-----127.0.0.1:7000 来查看解析后的堆文件(格式为html)

如下效果

windows监控cpu与内存性能命令 cpu内存监控工具_Java_13

拉到最后我们可以看到这些东西

windows监控cpu与内存性能命令 cpu内存监控工具_输出格式_14

说明:

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 执行对象查询语句