Java 自带了多个 JVM 调优工具,以下是其中一些常用的工具:

1)jps(JVM Process Status Tool):

用于显示当前系统中所有正在运行的 Java 进程的 PID 和相关信息。

image.png

2)jstat(JVM Statistics Monitoring Tool):

用于实时监控和输出 JVM 的各种统计数据,如类加载情况、垃圾回收情况等。

#jstat -gcutil pid ms
#pid=4873
#ms=1000:刷新时间间隔,单位ms
jstat -gcutil 4873 1000

image.png

jstat -gcutil pid ms 是一条 jstat 命令,用于输出指定进程的 JVM 内存使用情况,并且可以设置输出时间间隔。

其中,“-gcutil”参数表示输出当前堆内存区域(Eden、Survivor、Old Gen等)的使用率和占比情况,即各个区域已使用内存和总容量之比。这些指标可以帮助用户了解 JVM 的内存使用情况,并根据情况进行相应的调优。

  • “pid”是要监控的 Java 进程的进程 ID,通过 jps 命令可以获得当前系统中所有 Java 进程的 PID。

  • “ms”是指输出时间间隔,单位为毫秒。例如,执行 jstat -gcutil 1234 5000 命令将会每隔5秒输出一次进程 ID 为 1234 的 Java 应用程序的堆内存使用率和占比情况。

该命令可以方便地监控和分析 JVM 的内存使用情况,同时也是 JVM 调优工作中常用的工具之一。

3)jmap(JVM Memory Map Tool):

用于生成堆内存快照,并提供详细的堆内存信息,如对象数量、大小、类型等。

jmap 可以帮助开发者深入分析 Java 应用程序的内存使用情况,定位内存泄漏问题和优化内存使用效率。常见的使用方式如下:

(1)生成内存快照:使用 jmap 命令生成 Java 进程的内存快照文件,例如:

jmap -dump:format=b,file=heapdump.bin <pid>

其中,“-dump”参数表示生成内存快照,“format=b”表示生成二进制格式的快照文件,“file=heapdump.bin”指定生成的文件名,“<pid>”为要监控的 Java 进程的进程 ID。

image.png

(2)查看对象统计信息:使用 jmap 命令生成 Java 进程的对象统计信息,例如:

jmap -histo <pid>

该命令将输出每种对象类型的数量、占用空间大小和类全名等详细信息。

image.png

(3)查看 ClassLoader 统计信息:使用 jmap 命令生成 Java 进程的 ClassLoader 统计信息,例如:

jmap -clstats <pid>

该命令将输出当前 Java 进程中所有 ClassLoader 的统计信息,包括加载类数、卸载类数、总共加载的类数等。

image.png

4)jstack(JVM Stack Trace Tool):

用于输出指定进程的 Java 线程状态、调用栈和锁信息等,可以帮助用户分析线程问题。

jstack 的常见使用方式如下:

(1)输出线程状态:使用 jstack 命令输出指定 Java 进程中当前所有线程的状态,例如:

jstack <pid>

image.png

(2)输出死锁信息:使用 jstack 命令输出指定 Java 进程中的死锁信息,例如:

jstack -F -m <pid>

其中,“-F”参数表示强制输出线程堆栈信息,“-m”表示输出所有线程的调用栈信息。

image.png

5)jconsole(JVM Console Tool):

一个基于 GUI 的工具,可以监控 JVM 运行状态、内存使用情况、线程状态等,同时还提供了对 JVM 垃圾回收器和类加载器的配置选项。

image.png

6)jcmd(JVM Command Tool):

用于向正在运行的 Java 进程发送诊断命令,并输出相应的诊断信息。

jcmd 命令可以监控和管理正在运行的 Java 进程,包括线程状态、内存使用情况、GC 状态、类加载器信息等。常见的使用方式如下:

(1)列出当前所有可用的 Java 进程:使用 jcmd 命令列出当前系统中所有正在运行的 Java 进程,例如:

jcmd

image.png

(2)输出 Java 进程的 GC 信息:使用 jcmd 命令输出指定 Java 进程的 GC 相关信息,例如:

jcmd <pid> GC.info

(3)输出 Java 进程的线程堆栈信息:使用 jcmd 命令输出指定 Java 进程中所有线程的堆栈信息,例如:

jcmd <pid> Thread.print

image.png

(4)执行 Java 进程的垃圾回收操作:使用 jcmd 命令执行指定 Java 进程的垃圾回收操作,例如:

jcmd <pid> GC.run

==================================

转自:https://zhuanlan.zhihu.com/p/630343669?utm_id=0