定位问题,知识储备是基础,日志等数据是依据,工具则是帮助我们事半功倍的手段。
本文是在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,这种东西没必要记,只需要在大脑里有印象即可。
来源:https://www.cnblogs.com/CherryTab/p/12255451.html