Java虚拟机性能监控与故障处理工具

释放双眼,带上耳机,听听看~!

Java虚拟机性能监控与故障处理工具
上图是jdk/bin目录下面的exe可执行文件,我们都知道有一个叫做java.exe和javac.exe,但是伟大的jdk默默的为我们加入了这么多工具,我们先介绍其中几个重要工具。

JDK命令行工具

jps:虚拟机进程状态工具

jps的全称,JDK Process Status,熟悉linux的同学都知道ps命令,所以jps也就类似于ps命令,用来查看系统中所有的HotSpot虚拟机进程。

  • q 省略主类名称

  • m 输出传给main的参数

  • l 输出主类全名

  • v 输出启动参数


1
2
3
1jps -l
2
3

Java虚拟机性能监控与故障处理工具
这里显示的是我电脑上的java进程,可以看到我电脑上启动了finalshell,Proxyee,等应用,也就能判断出这些软件就是用java写的了。

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

jstat全称:JVM statistics-Monitoring Tool,用于监视虚拟机各种运行状态信息的命令行工具,显示本地或***远程***虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

  • class 监视类装载、卸载数量、总空间以及类装载所耗费的时间

  • gc 监视堆状态

  • gccapacity 基本与-gc相同,

  • gcutil 基本与gc相同

  • gccause 与gcutil功能一样, 但是会额外输出一次上次gc原因

  • gcnew 监视新生代的gc情况

  • gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注到的最大、最小空间

  • gcold 老年代gc

  • gcoldcapacity 与gcold基本相同

  • gcperncapacity 输出永久代使用的最大最小空间

  • compiler 输出JIT编译器编译过的方法、耗时等信息

  • printcompilation 输出已经被JIT编译过的方法


1
2
3
1jstat -gc 15960 250 20
2
3

Java虚拟机性能监控与故障处理工具

S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
官方解释

jinfo:Java配置信息工具

jinfo:Configuration Info for Java 实时查看和调整虚拟机各项参数。jps -v可以查看显式指定的参数,如果系那个知道未被显式指定的参数的系统默认值,就是用jinfo -flag 进行查找。


1
2
3
1jinfo -flag UseCMSInitiatingOccupancyOnly 7220
2
3

Java虚拟机性能监控与故障处理工具
UseCMSInitiatingOccupancyOnly 指示只有在老年代在使用了初始化的比例后 concurrent collector 启动收集 这里显示 – 说明没有开启。

jmap:Java内存映像工具

jmap:Memoory Map for Java,命令用于生成堆转储快照,如果不使用Jmap命令,要想获取Java堆转储快照,就需要将-XX:+HeapDumpOutOfMemoryError参数设置一下,让虚拟机在异常的时候自动生成dump文件,

  • dump 生成java堆转储快照

  • finalizerinfo 显示F-Queue中等待Finalizer线程执行finalize方法的对象,只在linux,Solaris中有效

  • heap 显示Java堆详细信息,

  • histo 显示堆中对象统计信息,

  • permstat 以ClassLoader为统计口径显示永久代内存状态

  • F 强制生成dump快照


1
2
3
1jmap -histo 20495
2
3

Java虚拟机性能监控与故障处理工具


1
2
3
1jmap -dump:format=b,file=eclipse.bin 20495
2
3

Java虚拟机性能监控与故障处理工具

Jhat:虚拟机堆转储快照分析工具

Jhat:JVM Heap Analysis Tool,用来分许jmap生成的堆转储快照,jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看,
Java虚拟机性能监控与故障处理工具
服务起来之后在浏览器查看:
Java虚拟机性能监控与故障处理工具

jstack:Java堆栈跟踪工具

jstack:Stack Trace for Java,命令用于生成虚拟机当前时刻的线程快照,就是当前虚拟机的每一条线程执行的方法堆栈的集合,主要目的是定位线程出现长时间停顿的原因,线程停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待着什么资源。

  • F 强制输出线程堆栈

  • l 除堆栈外,显示关于锁的附加信息

  • m 调用本地栈的堆栈


1
2
3
1jstack -l 7454
2
3

Java虚拟机性能监控与故障处理工具


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
1[root@VM_0_2_centos ~]# jstack -l 7454
22019-12-05 09:39:28
3Full thread dump OpenJDK 64-Bit Server VM (25.232-b09 mixed mode):
4
5"Attach Listener" #8 daemon prio=9 os_prio=0 tid=0x00007ff814001000 nid=0x246d waiting on condition [0x0000000000000000]
6   java.lang.Thread.State: RUNNABLE
7
8   Locked ownable synchronizers:
9        - None
10
11"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007ff83c117800 nid=0x1d33 runnable [0x0000000000000000]
12   java.lang.Thread.State: RUNNABLE
13
14   Locked ownable synchronizers:
15        - None
16
17"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007ff83c114800 nid=0x1d32 waiting on condition [0x0000000000000000]
18   java.lang.Thread.State: RUNNABLE
19
20   Locked ownable synchronizers:
21        - None
22
23"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007ff83c106000 nid=0x1d2c waiting on condition [0x0000000000000000]
24   java.lang.Thread.State: RUNNABLE
25
26   Locked ownable synchronizers:
27        - None
28
29"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007ff83c103800 nid=0x1d2a runnable [0x0000000000000000]
30   java.lang.Thread.State: RUNNABLE
31
32   Locked ownable synchronizers:
33        - None
34
35"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007ff83c0da000 nid=0x1d25 in Object.wait() [0x00007ff840246000]
36   java.lang.Thread.State: WAITING (on object monitor)
37        at java.lang.Object.wait(Native Method)
38        - waiting on <0x00000000f0808ed8> (a java.lang.ref.ReferenceQueue$Lock)
39        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
40        - locked <0x00000000f0808ed8> (a java.lang.ref.ReferenceQueue$Lock)
41        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
42        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
43
44   Locked ownable synchronizers:
45        - None
46
47"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007ff83c0d5000 nid=0x1d23 in Object.wait() [0x00007ff840347000]
48   java.lang.Thread.State: WAITING (on object monitor)
49        at java.lang.Object.wait(Native Method)
50        - waiting on <0x00000000f0806c00> (a java.lang.ref.Reference$Lock)
51        at java.lang.Object.wait(Object.java:502)
52        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
53        - locked <0x00000000f0806c00> (a java.lang.ref.Reference$Lock)
54        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
55
56   Locked ownable synchronizers:
57        - None
58
59"main" #1 prio=5 os_prio=0 tid=0x00007ff83c04b800 nid=0x1d1f waiting on condition [0x00007ff843bdc000]
60   java.lang.Thread.State: TIMED_WAITING (sleeping)
61        at java.lang.Thread.sleep(Native Method)
62        at Test.main(Test.java:6)
63
64   Locked ownable synchronizers:
65        - None
66
67"VM Thread" os_prio=0 tid=0x00007ff83c0cb800 nid=0x1d22 runnable
68
69"VM Periodic Task Thread" os_prio=0 tid=0x00007ff83c11a000 nid=0x1d34 waiting on condition
70
71JNI global references: 5
72
73
74

可以看到,main线程现在是waiting状态,还有其他好多线程就不讲解了。

JConsole :

这个工具就是各种监控都可以看到的。jdk bin目录下面。
Java虚拟机性能监控与故障处理工具
Java虚拟机性能监控与故障处理工具

visualvm:All-In-One

最后祭出大杀器,visualvm,多合一故障处理工具,里面插件很多,集合在一起,在bin目录下面,jvisualvm.exe
Java虚拟机性能监控与故障处理工具

给TA打赏
共{{data.count}}人
人已打赏
安全技术

用node.js从零开始去写一个简单的爬虫

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索