JVM性能调优监控工具
个人博客原文链接:《JVM性能监控工具》
注意⚠️:以下工具的演示基于openjdk1.8。
文章目录
1.jps:虚拟机进程状态工具
jps
是 Java Virtual Machine Process Status Tool的缩写,用于显示正在运行的Java进程。通过运行jps
命令,可以列出当前系统中所有正在运行的Java进程及其进程号(pid)。
命令格式:
jps [-q] [-mlvV] [<hostid>]
所支持的选项:
-q
:只显示进程ID,不显示进程的完整类名;
-m
:显示传递给主类的参数列表,也就是args;-l
:显示完整的包名和应用程序主类名;-v
:显示传递给主类的JVM参数;-V
:显示传递给JVM的标志;(这是JDK8新增的)<hostid>
:指定特定的RMI注册表的远程主机。
示例:
ahao@mycomputer bin % jps -q
40246
ahao@mycomputer bin % jps -m
40278 Jps -m
ahao@mycomputer bin % jps -l
40350 sun.tools.jps.Jps
ahao@mycomputer bin % jps -v
39855 Jps -Dapplication.home=/Users/xxx/Library/Java/JavaVirtualMachines/azul-1.8.0_412/Contents/Home -Xms8m
2.jstat:虚拟机统计信息监视工具
jstat
命令是用于监视Java虚拟机(JVM)统计信息的工具。它提供了一系列选项,用于收集和显示不同类型的JVM统计数据。
命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
所支持的选项:
<option>
:要显示的JVM统计数据的选项,可以是以下之一:class
:显示类加载、卸载和总计的统计数据。compiler
:显示即时编译器相关的统计数据。gc
:显示垃圾回收统计数据。gccapacity
:显示垃圾回收堆的容量统计数据。gcutil
:显示垃圾回收堆的使用情况统计数据。gccause
:显示导致最后一次垃圾回收的原因。gcnew
:显示新生代垃圾回收统计数据。gcnewcapacity
:显示新生代堆的容量统计数据。gcold
:显示老年代垃圾回收统计数据。gcpermcapacity
:显示永久代堆的容量统计数据。gcmetacapacity
:显示元数据区堆的容量统计数据。gcmetaspace
:显示元数据区统计数据。gcconstants
:显示常量池统计数据。compiler
:显示即时编译器相关统计数据。printcompilation
:显示已编译方法的统计数据。
-t
:可选参数,以时间戳形式显示统计信息。-h<lines>
:可选参数,指定输出的表头信息行数。<vmid>
:Java虚拟机进程的标识符,可以使用jps
命令查看。<interval>
:可选参数,指定刷新统计信息的时间间隔(毫秒),默认为1000ms。<count>
:可选参数,指定刷新统计信息的次数,默认为无限次。
示例:
# 表示每隔2000毫秒,刷新2次
ahao@mycomputer bin % jstat -gc 44597 2000 2
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
2048.0 2048.0 0.0 864.0 6144.0 1353.3 16384.0 13031.4 31536.0 29308.1 4400.0 3937.1 33 0.065 1 0.019 0.084
2048.0 2048.0 0.0 864.0 6144.0 1353.3 16384.0 13031.4 31536.0 29308.1 4400.0 3937.1 33 0.065 1 0.019 0.084
ahao@mycomputer bin % jstat -gcmetacapacity 44597 2000 2
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1077248.0 31536.0 0.0 1048576.0 4400.0 33 1 0.019 0.084
0.0 1077248.0 31536.0 0.0 1048576.0 4400.0 33 1 0.019 0.084
jstat -gc
结果中,各属性列的含义如下:
1.S0C(Survivor 0区域容量)
:表示年轻代中第一个幸存者区域的容量(字节)。
2. S1C(Survivor 1区域容量)
:表示年轻代中第二个幸存者区域的容量(字节)。
3.S0U(Survivor 0区域使用)
:表示年轻代中第一个幸存者区域的已使用容量(字节)。
4.S1U(Survivor 1区域使用)
:表示年轻代中第二个幸存者区域的已使用容量(字节)。
5.EC(Eden区域容量)
:表示年轻代中 Eden 区域的容量(字节)。
6.EU(Eden区域使用)
:表示年轻代中 Eden 区域的已使用容量(字节)。
7.OC(Old区域容量)
:表示老年代(Old)的容量(字节)。
8.OU(Old区域使用)
:表示老年代(Old)的已使用容量(字节)。
9.MC(Metaspace容量)
:表示 Metaspace(元数据空间)的容量(字节)。
10.MU(Metaspace使用)
:表示 Metaspace(元数据空间)的已使用容量(字节)。
11.CCSC(Compressed Class Space容量)
:表示压缩类空间(Compressed Class Space)的容量(字节)。
12.CCSU(Compressed Class Space使用)
:表示压缩类空间(Compressed Class Space)的已使用容量(字节)。
13.YGC(Young Generation垃圾回收次数)
:表示年轻代进行的垃圾回收次数。
14.YGCT(Young Generation垃圾回收总时间)
:表示年轻代垃圾回收操作所花费的总时间(秒)。
15.FGC(Full Generation垃圾回收次数)
:表示进行的完整(Full)垃圾回收次数。
16.FGCT(Full Generation垃圾回收总时间)
:表示完整(Full)垃圾回收所花费的总时间(秒)。
17.GCT(垃圾回收总时间)
:表示所有垃圾回收操作所花费的总时间(秒)。
3.jinfo:Java配置信息工具
jinfo
命令是用于实时地查看和修改Java应用程序运行时的配置信息的工具。它可以实时查看和修改Java虚拟机的参数。
命令格式:
jinfo [option] <pid>
(to connect to running process)
jinfo [option] <executable <core>
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
所支持的选项:
-flags
:显示JVM当前运行时的所有参数和系统属性;-sysprops
:显示JVM当前运行时的所有系统属性;-flag <name>
:显示指定名称的JVM参数的值;-flag [+/-]<name>
:启用或禁用指定名称的布尔类型JVM参数;-flag <name>=<value>
:设置指定名称的JVM参数为给定的值。
注意JDK 8在MacOS中使用jinfo会存在如下bug,该问题在JDK 9及更高版本中已被修复
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach symbolicator to the process
4.jmap:Java内存映像工具
jmap
是Java内存映像工具的命令行工具,用于生成Java应用程序在运行时的内存映像文件,可以用于分析应用程序的内存使用情况和分析内存泄漏问题。
命令格式:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
所支持的选项:
-heap
:打印Java堆的详细信息,包括堆的使用情况、垃圾收集器信息等。-histo[:live]
:生成堆的直方图,包括Java对象的数量、大小和类型等信息。[live]
选项将只显示活动对象的直方图。
-dump:[live,]format=b,file=<file>
:生成Java堆的内存快照文件,可以用来分析内存泄漏问题。[live,]
选项将只包含活动对象。format=b
则是指定输出文件的格式为二进制格式file=<file>
用于指定输出文件路径
-finalizerinfo
:打印所有的等待被Finalizer线程执行的对象。
示例:
ahao@mycomputer bin % jmap -dump:live,format=b,file=heapdump.bin 43912
Dumping heap to /User/xxx/bin/heapdump.bin...
Heap dump file created
5.jhat:虚拟机堆转储快照分析工具
jhat
是一个虚拟机堆转储快照分析工具,它可以将由jmap
生成的Java堆转储文件(heap dump)加载到内存中,并提供一个基于Web的界面来分析这些堆转储文件。
命令格式:
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] <file>
所支持的选项:
-stack <bool>
:指定是否显示对象的栈跟踪信息。默认为true
。-refs <bool>
:指定是否显示对象的引用关系。默认为true
。-port <port>
:指定HTTP服务器的监听端口。默认为7000。-baseline <file>
:指定一个基准堆转储文件,作为分析的参考。使用基准文件可以忽略已回收的对象。-debug <int>
:指定调试级别,可以是0-9之间的整数。调试级别越高,输出的调试信息越详细。-version
:显示jhat
的版本信息。<file>
参数是要加载的Java堆转储文件。该文件应该由jmap
命令生成。
示例:
ahao@mycomputer bin % jhat -port 8977 /Users/xxx/java_pid11047.hprof
Reading from /Users/xxx/java_pid11047.hprof...
Dump file created ...
Snapshot read, resolving...
Resolving 710937 objects...
Chasing references, expect 142 dots..............................................................................................................................................
Eliminating duplicate references..............................................................................................................................................
Snapshot resolved.
Started HTTP server on port 8977
Server is ready.
出现Server is ready.
结果后,用户即可在浏览器中输入http://localhost:8977/查看分析结果。
6.jstack:Java堆栈跟踪工具
jstack
工具用于生成Java应用程序的线程堆栈信息,以帮助诊断和调试应用程序的问题。它可以显示每个线程的调用堆栈,包括线程状态、锁信息等。
命令格式:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
所支持的选项:
-l
:生成长格式的堆栈跟踪信息,并且额外打印锁的相关信息。-F
:在jstack<pid>
不响应时,强制生成线程转储。主要用于进程挂起的情况下使用。-m
:同时打印Java和本地方法的堆栈帧信息。用于混合模式的堆栈跟踪。
示例:
ahao@mycomputer bin % jstack -l 59122
2024-08-15 11:46:51
Full thread dump OpenJDK 64-Bit Server VM (25.412-b08 mixed mode):
"RMI TCP Connection(4)-127.0.0.1" #43 daemon prio=5 os_prio=31 tid=0x00007f887aa01000 nid=0xad07 runnable [0x000000030f660000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
- locked <0x00000007bf25d730> (a java.io.BufferedInputStream)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:555)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$273/1381093736.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Locked ownable synchronizers:
- <0x00000007bf10f070> (a java.util.concurrent.ThreadPoolExecutor$Worker)
# 参略以下内容
7.jconsole:监视管理控制台
jconsole
是Java监视和管理控制台工具,它提供了一个图形界面,用于监视和管理Java虚拟机(JVM)和Java应用程序的性能和资源使用情况。
- 监视Java应用程序的活动线程数、内存使用情况、垃圾回收情况等。这些信息可以帮助你识别潜在的性能问题和内存泄漏。
- 远程连接到远程主机上运行的Java应用程序,进行远程性能监视和诊断。 - 运行垃圾回收和线程转储等诊断命令。
- 监视和管理 JVM的MBeans(管理bean)和JMX(Java Management Extensions)的相关特性。
可以与本地或远程的Java应用程序进行通信,它使用Java Management Extensions(JMX)技术来获取、监视和管理应用程序的运行时信息。
要使用jconsole
,只需在命令行中运行jconsole
命令即可。这将打开jconsole
图形界面,在界面中可以选择要监视和管理的Java进程。还可以指定远程主机和端口,以远程连接到运行在远程主机上的Java进程。
命令格式:
jconsole [ -interval=n ] [ -notile ] [ -pluginpath <path> ] [ -version ] [ connection ... ]
所支持的选项:
-
interval
:将更新间隔设置为 n 秒 (默认值为 4 秒) -
notile
:初始不平铺窗口 (对于两个或多个连接) -
pluginpath
:指定 jconsole 用于查找插件的路径 -
version
:输出程序版本 -
connection
:格式如下pid || host:port || JMX URL (service:jmx:<协议>://...)[]
pid
:目标进程的进程 IDhost
:远程主机名或 IP 地址port
:远程连接的端口号
-J
:指定运行 jconsole 的 Java 虚拟机的输入参数
8.jvisualvm:虚拟机故障处理工具
jdk9及以上不在自带jvisualvm,需要手动安装,官方下载地址:https://visualvm.github.io/。
jvisualvm
是Java虚拟机(JVM)监控和调优工具,它提供了一个图形化界面,用于监视和分析Java应用程序的性能和资源使用情况。
- 实时监视Java应用程序的内存使用、CPU利用率、垃圾回收情况等。
- 分析应用程序的线程状态和堆栈跟踪,帮助你定位性能瓶颈和线程问题。
- 查看和分析Java堆和方法区的内存分布和对象使用情况。
- 进行CPU性能分析,找出CPU密集型的代码路径。
- 运行垃圾回收器,并进行垃圾回收性能分析。
- 监控Java应用程序的网络活动和数据库连接。
- 通过插件支持,扩展和定制jvisualvm的功能。