JVM调优
java调优命令:
1、jps - 虚拟机进程状况工具
JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
$ jps [options] [hostid]
$ jps -l -m
2、jstat - 虚拟机统计信息监视工具
jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
$ jstat [option] LVMID [interval] [count]
- [option] : 操作参数
- LVMID : 本地虚拟机进程ID
- [interval] : 连续输出的时间间隔
- [count] : 连续输出的次数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ARIqfOT-1624537400593)(d:\我的文档\JD\office_dongdong\dengkun11\Temp\JdOnline20210618155746.png)]
#-class 监视类装载、卸载数量、总空间以及耗费的时间
$ jstat -class 13536
Loaded Bytes Unloaded Bytes Time
3607 6357.5 29 41.7 2.77
- Loaded : 加载class的数量
- Bytes : class字节大小
- Unloaded : 未加载class的数量
- Bytes : 未加载class的字节大小
- Time : 加载时间
#-compiler 输出JIT编译过的方法数量耗时等
$ jstat -compiler 1262
Compiled Failed Invalid Time FailedType FailedMethod
2157 0 0 1.88 0
- Compiled : 编译数量
- Failed : 编译失败数量
- Invalid : 无效数量
- Time : 编译耗时
- FailedType : 失败类型
- FailedMethod : 失败方法的全限定名
#-gc 垃圾回收堆的行为统计,常用命令 C即Capacity 总容量,U即Used 已使用的容量
$ jstat -gc 1262
#-gccapacity 同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
$ jstat -gccapacity 1262
#-gcutil 同-gc,不过输出的是已使用空间占总空间的百分比
$ jstat -gcutil 28920
#-gccause 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
$ jstat -gccause 28920
#-gcnew 统计新生代的行为
$ jstat -gcnew 28920
#-gcnewcapacity 新生代与其相应的内存空间的统计
$ jstat -gcnewcapacity 28920
#-printcompilation hotspot编译方法统计
$ jstat -printcompilation 28920
#每250毫秒查询一次进程31336的垃圾收集情况,一个查询20次
$ jstat -gc 31336 250 10
3、jinfo - Java配置信息工具
jinfo的作用是实时地查看和调整虚拟机各项参数。
# 查看进程31336所在虚拟机的配置信息
$ jinfo -flags 31336
4、jmap - Java内存映射工具
1、jmap(Memory Map for Java)命令用于生成堆转储快照(dump文件)。
2、如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。
3、jmap的作用不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用到是哪个收集器等。
# 打印等待回收对象的消息
$ jmap -finalizerinfo 31336
打印堆的概要信息,GC使用的算法,heap的配置及wise heap的使用情况
# 打印堆的概要信息
$ jmap -heap 31336
Attaching to process ID 31336, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 734003200 (700.0MB)
NewSize = 42991616 (41.0MB)
MaxNewSize = 244318208 (233.0MB)
OldSize = 87031808 (83.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 32505856 (31.0MB)
used = 10579888 (10.089767456054688MB)
free = 21925968 (20.910232543945312MB)
32.54763695501512% used
From Space:
capacity = 5242880 (5.0MB)
used = 3924256 (3.742462158203125MB)
free = 1318624 (1.257537841796875MB)
74.8492431640625% used
To Space:
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
PS Old Generation
capacity = 87031808 (83.0MB)
used = 155680 (0.148468017578125MB)
free = 86876128 (82.85153198242188MB)
0.1788771296121988% used
5390 interned Strings occupying 457600 bytes.
** 打印堆的对象统计,包括对象数、内存大小等等(因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 ) **
# 打印堆的对象统计
$ jmap -histo:live 31336 | more
num #instances #bytes class name
----------------------------------------------
1: 11088 1059416 [C
2: 633 423224 [B
3: 3525 393032 java.lang.Class
4: 2720 315216 [Ljava.lang.Object;
5: 10865 260760 java.lang.String
6: 6611 211552 java.util.concurrent.ConcurrentHashMap$Node
7: 6117 97872 java.lang.Object
...
说明:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象
5、 jhat - 虚拟机堆转储快照分析工具
jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。
6、jstack - Java堆栈跟踪工具
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
$ jstack -l 31336
2021-06-24 20:13:52
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode):
"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x00000000031a5800 nid=0x8638 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JPS event loop" #11 prio=5 os_prio=0 tid=0x00000000185b1000 nid=0x8180 runnable [0x000000001988e000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:296)
at sun.nio.ch.WindowsSelectorImpl$SubSelector.access$400(WindowsSelectorImpl.java:278)
at sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x00000000d445aa10> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x00000000d445aa28> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000000d445a990> (a sun.nio.ch.WindowsSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:803)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"Service Thread" #10 daemon prio=9 os_prio=0 tid=0x0000000017200800 nid=0x9bc runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread3" #9 daemon prio=9 os_prio=2 tid=0x0000000017166000 nid=0x25e8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
...