在这里插入图片描述
上图是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
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐