上图是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进程,可以看到我电脑上启动了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
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
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
1
2
3 1jmap -dump:format=b,file=eclipse.bin 20495
2
3
Jhat:虚拟机堆转储快照分析工具
Jhat:JVM Heap Analysis Tool,用来分许jmap生成的堆转储快照,jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看,
服务起来之后在浏览器查看:
jstack:Java堆栈跟踪工具
jstack:Stack Trace for Java,命令用于生成虚拟机当前时刻的线程快照,就是当前虚拟机的每一条线程执行的方法堆栈的集合,主要目的是定位线程出现长时间停顿的原因,线程停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待着什么资源。
-
F 强制输出线程堆栈
-
l 除堆栈外,显示关于锁的附加信息
-
m 调用本地栈的堆栈
1
2
3 1jstack -l 7454
2
3
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目录下面。
visualvm:All-In-One
最后祭出大杀器,visualvm,多合一故障处理工具,里面插件很多,集合在一起,在bin目录下面,jvisualvm.exe