Bootstrap

JVM监控与调优工具

在Java应用程序开发和运维过程中,对JVM(Java Virtual Machine)进行监控和调优是确保系统性能和稳定性的关键。JDK提供了一系列命令行工具,帮助开发者对JVM进行状态监控、性能分析和参数调优。本文介绍这些工具,包括jpsjstatjmapjhatjstackjinfo

1. jps:JVM Process Status Tool

jps(JVM Process Status Tool)用于显示系统内所有的HotSpot虚拟机进程。它可以帮助开发者快速定位运行中的Java进程。

使用示例

jps -l

-l参数表示显示主类的全限定名或启动时的jar文件路径。运行该命令后,系统会列出当前所有Java进程的PID和对应的主类名或jar路径。

输出示例

1234 /path/to/MyApplication.jar
5678 com.example.MyMainClass
2. jstat:JVM statistics Monitoring

jstat(JVM statistics Monitoring)用于监视虚拟机运行时状态信息,包括类装载、内存、垃圾收集、JIT编译等数据。它是进行性能分析的重要工具。

使用示例

监视垃圾收集情况,每5秒输出一次:

jstat -gc 1234 5000

其中,-gc表示监视垃圾收集情况,1234是目标Java进程的PID,5000表示间隔时间(毫秒)。

常用选项

  • -class:监视类装载、卸载数量和总空间等。
  • -gc:监视Java堆的情况,包括Eden区、两个Survivor区、老年代和永久代(或元空间)的容量和使用量。
  • -gccapacity:监视各个部分的容量和使用量。
  • -gcutil:同-gc,但是表达的是使用比例而不是容量。
  • -compiler:监视JIT编译器的行为。

输出示例(以-gc为例):

  S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
1024.0  1024.0  0.0    0.0   8192.0   2048.0   16384.0     4096.0   6144.0  1536.0  512.0   128.0     4      0.020     1      0.010    0.030

上述是jstat -gc命令的输出,用于显示Java堆内存的使用情况和垃圾回收的统计信息:

列名含义
S0C第一个幸存区(Survivor space 0)的当前容量(Current capacity, KB)
S1C第二个幸存区(Survivor space 1)的当前容量(Current capacity, KB)
S0U第一个幸存区(Survivor space 0)已使用的大小(Used size, KB)
S1U第二个幸存区(Survivor space 1)已使用的大小(Used size, KB)
EC伊甸园区(Eden space)的当前容量(Current capacity, KB)
EU伊甸园区(Eden space)已使用的大小(Used size, KB)
OC老年代(Old space)的当前容量(Current capacity, KB)
OU老年代(Old space)已使用的大小(Used size, KB)
MC元空间(Metaspace)的当前容量(Current capacity, KB)
MU元空间(Metaspace)已使用的大小(Used size, KB)
CCSC压缩类空间(Compressed class space)的当前容量(Current capacity, KB)
CCSU压缩类空间(Compressed class space)已使用的大小(Used size, KB)
YGC自JVM启动以来年轻代垃圾回收的次数(Young GC count)
YGCT自JVM启动以来年轻代垃圾回收的总时间(Young GC total time, seconds)
FGC自JVM启动以来老年代垃圾回收的次数(Full GC count)
FGCT自JVM启动以来老年代垃圾回收的总时间(Full GC total time, seconds)
GCT自JVM启动以来垃圾回收的总时间(Total GC time, seconds),等于YGCT + FGCT
3. jmap:JVM Memory Map

jmap(JVM Memory Map)用于生成heap dump文件,帮助开发者分析内存使用情况,定位内存泄漏等问题。

使用示例

生成heap dump文件:

jmap -dump:live,format=b,file=heapdump.hprof 1234

该命令会生成一个名为heapdump.hprof的heap dump文件,live选项表示只导出存活的对象,1234是目标Java进程的PID。

常用选项

  • -heap:显示Java堆的详细信息,包括堆配置、堆使用情况等。
  • -histo:显示堆中对象的统计信息,包括类名、对象数量、占用内存大小等。
  • -dump:生成heap dump文件。
4. jhat:JVM Heap Analysis Tool

jhat(JVM Heap Analysis Tool)与jmap搭配使用,用于分析jmap生成的dump文件。jhat内置了一个微型的HTTP/HTML服务器,生成的分析结果可以在浏览器中查看。

使用示例

jhat heapdump.hprof

运行该命令后,jhat会在默认端口(7000)启动一个HTTP服务器,读者可以在浏览器中访问http://localhost:7000查看分析结果。

浏览器界面

在浏览器中,你可以看到堆的总体信息、类的统计信息、对象的实例数等详细信息。这些信息对于定位内存问题非常有帮助。

5. jstack:Java Thread Stack

jstack用于生成Java虚拟机当前时刻的线程快照,帮助开发者分析线程状态、定位死锁等问题。

使用示例

生成线程快照:

jstack 1234 > thread_dump.txt

该命令会将目标Java进程(PID为1234)的线程快照输出到thread_dump.txt文件中。

线程快照分析

在生成的线程快照文件中,可以看到每个线程的状态、堆栈信息、持有的锁和等待的锁等信息。这些信息对于定位线程问题(如死锁、线程挂起等)非常有用。

6. jinfo:JVM Configuration info

jinfo(JVM Configuration info)用于实时查看和调整虚拟机运行参数,帮助开发者了解JVM的配置信息,并在必要时进行调整。

使用示例

查看JVM参数:

jinfo -flags 1234

该命令会显示目标Java进程(PID为1234)的JVM参数设置。

调整JVM参数

在某些情况下,你可能需要调整JVM的运行参数来优化性能。这可以通过jinfo-flag选项来实现,但是需要注意的是,并不是所有的参数都可以在运行时动态修改。

示例(假设要修改某个参数,如MaxHeapSize):

jinfo -flag MaxHeapSize=2048m 1234

该命令会尝试将目标Java进程的最大堆内存设置为2048MB。但是,请注意,并不是所有的参数都支持这种动态修改,且修改参数可能会引发不可预知的行为,因此在进行此类操作时应格外小心。

结语

工具名称特点适用场景
jps列出当前机器上所有的Java进程,显示Java进程的进程号、启动参数和主类等信息需要快速查看或管理当前机器上的Java进程时,如进行进程监控或管理
jstat对Java应用程序的堆内存使用情况进行监控,提供垃圾回收统计信息,还可以监视类加载、编译和垃圾回收等信息需要对Java应用程序的内存使用情况和垃圾回收性能进行详细分析时,如进行性能调优
jmap生成Java堆转储快照,还可以查看堆中的对象实例信息、类的加载信息等需要对Java堆内存中的对象分布、内存占用情况进行深入分析时,如进行内存泄漏诊断
jhat分析Java堆转储快照,提供一个Web界面用于查看堆中的对象实例信息、引用关系等需要对Java堆转储快照进行可视化分析时,如进行内存泄漏分析或对象引用关系梳理
jstack生成Java进程的线程快照,显示线程的调用栈信息,包括线程状态、锁信息等需要对Java应用程序的线程运行状态、死锁问题进行诊断时,如进行线程问题排查
jinfo显示Java进程的配置信息,包括JVM参数、系统属性等,还可以动态修改部分JVM参数需要查看或修改Java进程的配置信息时,如进行JVM参数调优或系统属性查看
;