文章目录
概述
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,接下来逐一对各种工具作一介绍。
jps(Java Virtual Machine Process Status Tool)
作用
用于输出JVM进程状态信息
语法(说明)
jps [options] [hostid]
1.options
命令选项,用来对输出格式进行控制,jps命令选项如下:
-q
不输出类名、Jar名和传入main方法的参数,只输出本地虚拟机唯一ID,例如
D:\Program_Files\java\jdk1.8.0_91\bin>jps -q
7872
-m
输出传入main方法的参数,例如
4316 Jps -m
-l
输出main类或Jar的全限名,例如
1916 sun.tools.jps.Jps
-v
输出传入JVM的参数,例如
9024 Jps -Dapplication.home=D:\Program_Files\java\jdk1.8.0_91 -Xms8m
2.hostid
指定监控主机,默认为当前主机;
jmap
作用
监控内存内的Java对象
语法(说明)
jmap [option] <pid>
option
命令选项,常用选项如下:
-heap
打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
C:\Users\liuyingjie>jmap -heap 2764
Attaching to process ID 2764, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.201-b09
using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 1048576 (1.0MB)
MaxNewSize = 643825664 (614.0MB)
OldSize = 4194304 (4.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 12582912 (12.0MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 4294901760 (4095.9375MB)
G1HeapRegionSize = 1048576 (1.0MB)
Heap Usage:
G1 Heap:
regions = 1024
capacity = 1073741824 (1024.0MB)
used = 128709824 (122.74725341796875MB)
free = 945032000 (901.2527465820312MB)
11.98703646659851% used
G1 Young Generation:
Eden Space:
regions = 34
capacity = 150994944 (144.0MB)
used = 35651584 (34.0MB)
free = 115343360 (110.0MB)
23.61111111111111% used
Survivor Space:
regions = 3
capacity = 3145728 (3.0MB)
used = 3145728 (3.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 87
capacity = 114294784 (109.0MB)
used = 89912512 (85.74725341796875MB)
free = 24382272 (23.25274658203125MB)
78.66720497061353% used
56640 interned Strings occupying 5528928 bytes.
-histo[:live]
打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象,如下命令:
jmap -histo 2764
num #instances #bytes class name
----------------------------------------------
1: 245237 26378800 [C
2: 18355 19262448 [B
3: 45062 14682856 [I
4: 245389 5889336 java.util.HashMap$Node
5: 274529 4392464 java.lang.String
6: 44989 4087960 [Ljava.util.HashMap$Node;
7: 68684 3150440 [Ljava.lang.Object;
8: 18342 1841288 java.lang.Class
9: 28573 1828672 java.lang.reflect.Field
10: 42818 1712720 java.util.HashMap
11: 30488 1556088 [Ljava.lang.String;
12: 32420 1037440 java.util.LinkedHashMap$Entry
class name列出现了[C、[B、[L等很奇怪的内容,这些属于非自定义类,具体为:
-permstat
打印永久代统计信息
-finalizerinfo
打印等待回收的对象信息,如下命令:
jmap -finalizerinfo 2764
Attaching to process ID 2764, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.201-b09
Number of objects pending for finalization: 0
Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象。
-dump
带有参数
<dump-options>
以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看;
live
只输出活着的对象;不指定,则输出堆中所有对象
format=b
指定输出格式为二进制
file= (file)
指定文件名及文件存储位置,例如:
jmap -dump:live,format=b,file=D:\heap.bin 2764
<pid>Dumping heap to D:\heap.bin ...
Heap dump file created
-F
与-dump: 或-histo一起使用,当没有响应时,强制执行;
注意:不支持live子选项
pid
进程id
jhat
用于分析产生的堆文件,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
1.导出堆文件
jmap -dump:live,format=b,file=D:\heap.bin 2764
<pid>Dumping heap to D:\heap.bin ...
Heap dump file created
注意:除jmap命令外,还可以通过以下方式获取堆文件:
1、使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件);
2、JVM启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError异常时, 会自动执行堆转储。
2.分析堆文件:
jhat -J-Xmx512m 解析Java堆转储文件,并启动一个 web server;
说明:有时dump出来的堆文件很大,在启动时报堆空间不足的错误,可添加-J-Xmx512M参数;
jhat -J-Xmx512M D:\heap.log
Reading from D:\heap.bin...
Dump file created Mon Jul 22 15:08:03 CST 2019
Snapshot read, resolving...
Resolving 1670770 objects...
Chasing references, expect 334 dots..............................................................................................................................................................................................................................................................................................................................................
Eliminating duplicate references..............................................................................................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000 //端口号
Server is ready.
3、查看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 执行对象查询语句