Java虚拟机性能监控与故障处理工具
上图是jdk/bin目录下面的exe可执行文件,我们都知道有一个叫做java.exe和javac.exe,但是伟大的jdk默默的为我们加入了这么多工具,我们先介绍其中几个重要工具。JDK命令行工具jps:虚拟机进程状态工具jps的全称,JDK Process Status,熟悉linux的同学都知道ps命令,所以jps也就类似于ps命令,用来查看系统中所有的HotSpot虚拟机进程。q...
上图是jdk/bin目录下面的exe可执行文件,我们都知道有一个叫做java.exe和javac.exe,但是伟大的jdk默默的为我们加入了这么多工具,我们先介绍其中几个重要工具。
JDK命令行工具
jps:虚拟机进程状态工具
jps的全称,JDK Process Status,熟悉linux的同学都知道ps命令,所以jps也就类似于ps命令,用来查看系统中所有的HotSpot虚拟机进程。
- q 省略主类名称
- m 输出传给main的参数
- l 输出主类全名
- v 输出启动参数
jps -l
这里显示的是我电脑上的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编译过的方法
jstat -gc 15960 250 20
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 进行查找。
jinfo -flag UseCMSInitiatingOccupancyOnly 7220
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快照
jmap -histo 20495
jmap -dump:format=b,file=eclipse.bin 20495
Jhat:虚拟机堆转储快照分析工具
Jhat:JVM Heap Analysis Tool,用来分许jmap生成的堆转储快照,jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看,
服务起来之后在浏览器查看:
jstack:Java堆栈跟踪工具
jstack:Stack Trace for Java,命令用于生成虚拟机当前时刻的线程快照,就是当前虚拟机的每一条线程执行的方法堆栈的集合,主要目的是定位线程出现长时间停顿的原因,线程停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待着什么资源。
- F 强制输出线程堆栈
- l 除堆栈外,显示关于锁的附加信息
- m 调用本地栈的堆栈
jstack -l 7454
[root@VM_0_2_centos ~]# jstack -l 7454
2019-12-05 09:39:28
Full thread dump OpenJDK 64-Bit Server VM (25.232-b09 mixed mode):
"Attach Listener" #8 daemon prio=9 os_prio=0 tid=0x00007ff814001000 nid=0x246d waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007ff83c117800 nid=0x1d33 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007ff83c114800 nid=0x1d32 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007ff83c106000 nid=0x1d2c waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007ff83c103800 nid=0x1d2a runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007ff83c0da000 nid=0x1d25 in Object.wait() [0x00007ff840246000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000f0808ed8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
- locked <0x00000000f0808ed8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
Locked ownable synchronizers:
- None
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007ff83c0d5000 nid=0x1d23 in Object.wait() [0x00007ff840347000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000f0806c00> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x00000000f0806c00> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Locked ownable synchronizers:
- None
"main" #1 prio=5 os_prio=0 tid=0x00007ff83c04b800 nid=0x1d1f waiting on condition [0x00007ff843bdc000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Test.main(Test.java:6)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=0 tid=0x00007ff83c0cb800 nid=0x1d22 runnable
"VM Periodic Task Thread" os_prio=0 tid=0x00007ff83c11a000 nid=0x1d34 waiting on condition
JNI global references: 5
可以看到,main线程现在是waiting状态,还有其他好多线程就不讲解了。
JConsole :
这个工具就是各种监控都可以看到的。jdk bin目录下面。
visualvm:All-In-One
最后祭出大杀器,visualvm,多合一故障处理工具,里面插件很多,集合在一起,在bin目录下面,jvisualvm.exe
更多推荐
所有评论(0)