JDK自带监控工具jstat、jmap、jstack的使用指南(附命令示例)

 更新时间:2026年01月20日 11:13:43   作者:fyakm  
jstat是JDK中提供的一个命令行工具,主要用来打印JVM 性能数据相关的统计数据,这篇文章主要介绍了JDK自带监控工具jstat、jmap、jstack的使用指南,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在JVM性能监控的领域里,JDK为我们提供了一系列强大的工具。其中,jstat、jmap、jstack这三个工具就像是三位得力的助手,帮助我们深入了解JVM的运行状态,及时发现和解决性能问题。接下来,我们就一起详细了解这三款工具的功能、使用方法以及相关的命令示例,让你轻松掌握JVM性能监控的技巧。

核心工具功能介绍

jstat工具

jstat(Java Virtual Machine Statistics Monitoring Tool) 是用于监控虚拟机各种运行状态信息的工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。用大白话来讲,jstat就像是一个“数据探测器”,能帮我们查看JVM内部的各种运行数据。

  • 类装载信息监控:可以查看类的加载、卸载数量以及类加载所耗费的时间等信息。例如,通过查看类加载的时间,我们可以判断是否存在类加载过慢的问题,这可能是由于类路径配置不合理或者磁盘I/O性能不佳导致的。
  • 内存使用情况监控:能够实时显示JVM各内存区域(如堆内存、非堆内存)的使用量和占用率等信息。通过监控内存使用情况,我们可以及时发现内存泄漏或者内存溢出的潜在风险。
  • 垃圾收集统计信息监控:可以获取垃圾收集的次数、时间以及各代内存区域的垃圾回收情况等信息。这有助于我们分析垃圾回收的效率,判断是否需要调整垃圾回收策略。

jmap工具

jmap(Java Memory Map) 主要用于生成堆转储快照(也称为heap dump文件),还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前使用的是哪种垃圾收集器等。简单来说,jmap就像是一个“内存快照相机”,能帮我们拍下JVM内存的当前状态。

  • 生成堆转储快照:通过执行相应的命令,jmap可以将JVM的堆内存状态以文件的形式保存下来。这个堆转储快照文件对于后续分析内存泄漏、内存溢出等问题非常有帮助。
  • 查看堆内存详细信息:可以获取堆内存的使用情况、各代内存区域的大小和占用率等信息,帮助我们了解JVM的内存分配情况。
  • 查看永久代信息(在JDK 8及以前):在JDK 8及以前的版本中,jmap还可以查看永久代的相关信息,包括永久代的大小、使用情况等。

jstack工具

jstack(Java Stack Trace) 用于生成Java虚拟机当前时刻的线程快照。线程快照就是当前Java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致的长时间等待等。可以把jstack想象成一个“线程侦探”,帮我们找出线程运行中存在的问题。

  • 分析线程状态:通过查看线程快照,我们可以了解每个线程的当前状态,如RUNNABLE(运行中)、WAITING(等待)、TIMED_WAITING(限时等待)等。这有助于我们分析线程的运行情况,找出可能存在的问题。
  • 检测线程死锁:jstack可以检测到线程之间是否存在死锁的情况。死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,会导致程序无法正常运行。通过jstack的输出,我们可以快速定位到死锁的线程和相关的代码位置。

实操演示:常用命令示例

jstat命令示例

  • 查看类加载信息
jstat -class <pid>

这里的 <pid> 是Java进程的ID。执行该命令后,会显示类加载的数量、卸载的数量、类加载和卸载所耗费的时间等信息。例如:

Loaded  Bytes  Unloaded  Bytes     Time
  1234   2345       10     20       1.23

这表示已经加载了1234个类,占用了2345KB的内存,卸载了10个类,卸载的类占用了20KB的内存,类加载和卸载总共花费了1.23秒。

  • 查看垃圾收集信息
jstat -gc <pid> <interval> <count>

<interval> 表示统计信息输出的时间间隔(单位为毫秒),<count> 表示输出的次数。例如,执行 jstat -gc 1234 1000 5 表示每隔1000毫秒(即1秒)输出一次Java进程ID为1234的垃圾收集信息,总共输出5次。输出信息示例如下:

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
20480.0 20480.0  0.0   0.0   102400.0 40960.0   204800.0    30720.0  10240.0 8192.0 1024.0  819.2     10    0.123     2    0.234    0.357

其中,各列的含义如下:

  • S0CS1C:分别表示Survivor 0区和Survivor 1区的容量(单位为KB)。
  • S0US1U:分别表示Survivor 0区和Survivor 1区的使用量(单位为KB)。
  • ECEU:分别表示Eden区的容量和使用量(单位为KB)。
  • OCOU:分别表示老年代的容量和使用量(单位为KB)。
  • MCMU:分别表示方法区(元空间)的容量和使用量(单位为KB)。
  • CCSCCCSU:分别表示压缩类空间的容量和使用量(单位为KB)。
  • YGC:表示年轻代垃圾收集的次数。
  • YGCT:表示年轻代垃圾收集所耗费的总时间。
  • FGC:表示老年代垃圾收集的次数。
  • FGCT:表示老年代垃圾收集所耗费的总时间。
  • GCT:表示总的垃圾收集时间。

jmap命令示例

  • 生成堆转储快照
jmap -dump:format=b,file=heapdump.hprof <pid>

该命令会将Java进程ID为 <pid> 的堆内存状态以二进制格式保存到 heapdump.hprof 文件中。生成的堆转储快照文件可以使用一些工具(如Eclipse Memory Analyzer)进行分析,以找出内存泄漏等问题。

  • 查看堆内存详细信息
jmap -heap <pid>

执行该命令后,会输出堆内存的详细信息,包括堆内存的使用情况、各代内存区域的大小和占用率、当前使用的垃圾收集器等信息。示例输出如下:

Attaching to process ID 1234, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.8.0_271

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 5570560 (5.3125MB)
   MaxNewSize               = 715773952 (682.6171875MB)
   OldSize                  = 11272192 (10.75MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 20635648 (19.680908203125MB)
   used     = 10485760 (10.0MB)
   free     = 10149888 (9.680908203125MB)
   50.81373291925466% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 104857600 (100.0MB)
   used     = 31457280 (30.0MB)
   free     = 73400320 (70.0MB)
   30.0% used

2222 interned Strings occupying 184016 bytes.

jstack命令示例

  • 查看线程快照
jstack <pid>

执行该命令后,会输出Java进程ID为 <pid> 的所有线程的当前状态和堆栈信息。示例输出如下:

2024-07-01 10:00:00
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.271-b09 mixed mode):

"Attach Listener" #10 daemon prio=9 os_prio=0 tid=0x00007f9d8c001000 nid=0x2d03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"DestroyJavaVM" #1 prio=5 os_prio=0 tid=0x00007f9d9000b800 nid=0x2cfe waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-0" #2 prio=5 os_prio=0 tid=0x00007f9d9000c800 nid=0x2cff waiting on condition [0x00007f9d7c70e000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.example.MyClass$MyThread.run(MyClass.java:20)

...

从输出信息中,我们可以看到每个线程的ID、优先级、状态以及正在执行的方法堆栈等信息。通过分析这些信息,我们可以找出线程运行中存在的问题,如线程死锁、死循环等。

总结与展望

通过学习jstat、jmap、jstack这三款JDK自带的监控工具,我们掌握了一种强大的JVM性能监控手段。jstat让我们可以实时监控JVM的各种运行数据,jmap能帮助我们获取堆内存的详细信息和生成堆转储快照,jstack则用于分析线程的运行状态和检测线程死锁。这些工具对于解决JVM性能问题、优化程序运行效率非常有帮助。

掌握了这些工具的使用方法后,下一节我们将深入学习其他JVM性能监控工具,进一步完善对本章JVM性能监控工具主题的认知。让我们继续探索,提升自己在JVM性能监控方面的技能。

到此这篇关于JDK自带监控工具jstat、jmap、jstack的使用指南的文章就介绍到这了,更多相关JDK监控工具jstat、jmap、jstack使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现过滤掉map集合中key或value为空的值示例

    Java实现过滤掉map集合中key或value为空的值示例

    这篇文章主要介绍了Java实现过滤掉map集合中key或value为空的值,涉及java针对map的简单遍历、判断、移除等相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • SpringMVC REST风格深入详细讲解

    SpringMVC REST风格深入详细讲解

    这篇文章主要介绍了SpringMVC REST风格,Rest全称为Representational State Transfer,翻译为表现形式状态转换,它是一种软件架构
    2022-10-10
  • 详解PipedInputStream和PipedOutputStream_动力节点Java学院整理

    详解PipedInputStream和PipedOutputStream_动力节点Java学院整理

    这篇文章主要为大家详细介绍了管道PipedInputStream和PipedOutputStream,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • SpringBoot基于Path获取文件二进制流的几种方法小结

    SpringBoot基于Path获取文件二进制流的几种方法小结

    这篇文章主要介绍了在SpringBoot中获取文件二进制流数据(byte[])的三种方法,并提供了每个方法的完整代码示例,需要的朋友可以参考下
    2026-01-01
  • java 中Comparable与Comparator详解与比较

    java 中Comparable与Comparator详解与比较

    这篇文章主要介绍了java 中Comparable与Comparator详解与比较的相关资料,需要的朋友可以参考下
    2017-04-04
  • SpringBoot处理JSON数据方法详解

    SpringBoot处理JSON数据方法详解

    这篇文章主要介绍了SpringBoot整合Web开发中Json数据处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-10-10
  • Java调用SQL脚本执行常用的方法示例

    Java调用SQL脚本执行常用的方法示例

    这篇文章主要给大家介绍了关于Java调用SQL脚本执行常用的方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Java实现配置加载机制

    Java实现配置加载机制

    这篇文章主要介绍了Java实现配置加载机制的相关资料,需要的朋友可以参考下
    2016-01-01
  • SpringBoot调用对方webService接口的几种方法示例

    SpringBoot调用对方webService接口的几种方法示例

    平常我们开发调用接口一般会用到几种数据格式,比如有restful的,这个是目前最流行的,也是最简单开发的,还有一种就是webservice数据格式,本文给大家介绍了几种SpringBoot调用对方webService接口的方法,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • springboot常用注释的讲解

    springboot常用注释的讲解

    今天小编就为大家分享一篇关于springboot常用注释的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04

最新评论