虚拟机的监控工具

二次信任 提交于 2020-02-03 14:18:24

定位问题,知识储备是基础,日志等数据是依据,工具则是帮助我们事半功倍的手段。

 

本文是在win下测试,主要介绍一些工具的使用。

 

1.jps:虚拟机进程状况工具

JVM Process Status Tool

可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。

C:\Users\***\Desktop\64124-深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)_源码>jps -l
39172 sun.tools.jps.Jps
24396
24476 org.jetbrains.jps.cmdline.Launcher

 

 

 

 

2.jstat:虚拟机统计信息工具

JVM Statistics Monitoring Tool

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程[插图]虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有GUI图形界面、只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的常用工具。

C:\Users\***\Desktop\64124-深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)_源码>jstat -gcutil 24476
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 75.50   0.00  76.86   0.20  97.04  92.93      2    0.009     0    0.000    0.009

查询结果表明:这台服务器的新生代Eden区(E,表示Eden)使用了76.8%的空间,2个Survivor区(S0、S1,表示Survivor0、Survivor1),老年代(O,表示Old)和永久代(P,表示Permanent)则分别使用了0.2%和97.4%的空间(这里没有P只有M,对照看的话应该就是P)。程序运行以来共发生MinorGC(YGC,表示Young GC)2次,总耗时0.1009秒;发生Full GC(FGC,表示Full GC)0次,总耗时(FGCT,表示Full GC Time)为0秒;所有GC总耗时(GCT,表示GC Time)为0.009秒。

 

 

 

3.jinfo:Java配置信息

configuration info for java

这里也就是查-XX:....这类的配置

C:\Users\***\Desktop\64124-深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)_源码>jinfo -flag CMSInitiatingOccupancyFraction 24476
-XX:CMSInitiatingOccupancyFraction=-1

 

4.jmap:java内存映像工具

memory map for java

 

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。如果不使用jmap命令,要想获取Java堆转储快照也还有一些比较“暴力”的手段:譬如在第2章中用过的-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件,通过-XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成堆转储快照文件,又或者在Linux系统下通过Kill-3命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。对于IDEA的话还有快捷键。

C:\Users\***\Desktop\64124-深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)_源码>jmap -dump:format=b,file=eclipse.bin 24476
Dumping heap to C:\Users\hufan\Desktop\64124-深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)_源码\eclipse.bin ...
Heap dump file created

 

 

 

5.jhat:堆转储快照分析

jvm heap analysis tool

主要是分析jmap的堆快照,基本没人用

 

C:\Users\***\Desktop\64124-深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)_源码>jhat eclipse.bin
Reading from eclipse.bin...
Dump file created Mon Feb 03 13:25:03 CST 2020
Snapshot read, resolving...
Resolving 3026440 objects...
Chasing references, expect 605 dots............................................................................................................................
...............................................................................................................................................................
...............................................................................................................................................................
...............................................................................................................................................................
....
Eliminating duplicate references...............................................................................................................................
...............................................................................................................................................................
...............................................................................................................................................................
...............................................................................................................................................................
.
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

这时打开浏览器输入   http://localhost:7000/  可以看分析结果了。

 

6.jsatck:java堆栈跟踪工具

stack trace for java

这个主要是查看各个线程堆栈

C:\Users\***\Desktop\64124-深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)_源码>jstack 24396
2020-02-03 13:29:05
Full thread dump OpenJDK 64-Bit Server VM (25.202-b44 mixed mode):

"JobScheduler FJ pool 4/7" #170 daemon prio=4 os_prio=-1 tid=0x00000000242dd000 nid=0x2d6c waiting on condition [0x000000004662f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000e33ce9b0> (a java.util.concurrent.ForkJoinPool)
        at java.util.concurrent.ForkJoinPool.awaitWork(ForkJoinPool.java:1824)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1693)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

"JobScheduler FJ pool 3/7" #169 daemon prio=4 os_prio=-1 tid=0x00000000242dc800 nid=0x9770 waiting on condition [0x000000004652f000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000e33ce9b0> (a java.util.concurrent.ForkJoinPool)
        at java.util.concurrent.ForkJoinPool.awaitWork(ForkJoinPool.java:1824)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1693)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

 

从JDK 5起,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码完成jstack的大部分功能。

 

java的一些命令行工具,可以自行google,这种东西没必要记,只需要在大脑里有印象即可。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!