java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JDK监控工具jstat、jmap、jstack使用

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

作者: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内部的各种运行数据。

jmap工具

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

jstack工具

jstack(Java Stack Trace) 用于生成Java虚拟机当前时刻的线程快照。线程快照就是当前Java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致的长时间等待等。可以把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

其中,各列的含义如下:

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使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文