JVM学习之jstat使用方法

本文介绍Jstat工具的基本语法及多种选项的应用场景,如监控类加载、JIT编译、垃圾回收等,帮助读者掌握JVM性能监控技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jstat是JDK自带的一个轻量级工具,主要用JVM内建的指令对java应用程序的资源和性能进行实时的监控。

基本语法

  jstat <option> [-t] [-h] <pid>  <interval> <count>

  参数解释:

  • option   可以从下面参数中选择
    • -class                 显示ClassLoad的相关信息;
    • -compiler           显示JIT编译的相关信息;
    • -gc                     显示和gc相关的堆信息;
    • -gccapacity     显示各个代的容量以及使用情况;
    • -gccause             显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
    • -gcnew               显示新生代信息;
    • -gcnewcapacity  显示新生代大小和使用情况;
    • -gcold                 显示老年代和永久代的信息;
    • -gcoldcapacity    显示老年代的大小;
    • -gcpermcapacity 显示永久代的大小;
    • -gcutil             显示垃圾收集信息;   
    • -printcompilation输出JIT编译的方法信息;
  • -t         可以在打印的列加上Timestamp列,用于显示系统运行的时间
  • -h     可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头
  • interval 执行每次的间隔时间,单位为毫秒
  • count   用于指定输出多少次记录,缺省则会一直打印

  使用说明

  首先我们 使用linux命令 ps -ef|grep resin 查看我要监视进程的pid 23814

  -

  1、-class (jstat -class pid 1000 5 查看pid为23814的ClassLoad相关信息,每秒钟打印一次,总共打印5次)

  

  • Loaded 加载类的数量
  • Bytes 加载类合计大小
  • Unloaded 卸载类的数量
  • Bytes 卸载类合计大小
  • Time 表示加载和卸载类总共的耗时

  加载了9276个类,总大小为18045.9byte 卸载类0个,总大小为0byte,卸载和加载总耗时9.24ms

  2、-compiler (Jstat -cpmpiler pid)

  

  • Compiled 表示编译任务执行的次数
  • Failed 表示编译失败的次数
  • Invalid 表示编译不可用的次数
  • Time 表示编译的总耗时
  • FailedType 表示最后一次编译的类型
  • FailedMethod 表示最后一次编译失败的类名和方法名

  3、-gc (jstat -gc pid 1000 5 )

  

  • S0C: Survivor0(幸存区0)大小(KB)
  • S1C: Survivor1(幸存区1)1大小(KB)
  • S0U: Survivor0(幸存区0)已使用大小(KB)
  • S1U: Survivor1(幸存区1)已使用大小(KB)
  • EC  : Eden(伊甸区)大小(KB)
  • EU  : Eden(伊甸区)已使用大小(KB)
  • OC :老年代大小(KB)
  • OU : 老年代已使用大小(KB)
  • PC : Perm永久代大小(KB)
  • PU : Perm永久代已使用大小(KB)
  • YGC:新生代GC个数
  • YGCT:新生代GC的耗时(秒)
  • FGC  :Full GC次数
  • FGCT:Full GC耗时(秒)
  • GCT :GC总耗时(秒) 

  4、-gccapacity(jstat -gccapacity pid:显示各个代的容量的信息)

  

  • NGCMN:新生代最小值(KB)
  • NGVMX:新生代最大值(KB)
  • NGC:当前新生代大小(KB)
  • S0C:同上
  • S1C:同上
  • EC:同上
  • OGCMN:老年代最小值(KB)
  • OGCMX:老年代最大值(KB)
  • OGC:当前老年代大小(KB)
  • OC:同上
  • PGCMN:永久代最小值(KB)
  • PGCMX:永久代最大值(KB)
  • PGC:当前永久代大小(KB)
  • PC:同上
  • YGC:同上
  • FGC:同上

 5、-gccause(jstat -gccause pid:显示最近一次GC的原因)

  

  • LGCC:上一次GC的原因,是G1垃圾回收器回收
  • GCC :当前GC的原因

 6、-gcnew (jstat -gcnew pid:显示新生代的详细信息)

  

  • TT:新生代到老年代的年龄;
  • MTT:新生代到老年代的最大年龄;
  • DSS:所需的survivor的大小;

  7、-gcnewcapacity(jstat -gcnewcapacity pid:输出新生代各个区的详细信息)

  

  • S0CMX:S0最大空间大小(KB)
  • S1CMX:S1最大空间大小(KB)
  • ECMX:Eden最大空间大小(KB)
  • NGCMX:年轻代最大空间大小(KB)

  8、-gcold(jstat -gcold pid:显示老年代GC的详细情况)

  

 9、-gcoldcapacity(jstat -gcoldcapacitp pid:输出老年代的详细信息)

  

 10、-gcutil(jstat -gcutil pid:查看每个代区域使用的百分比情况)

  

<think>好的,用户想了解如何使用jstat进行JVM性能调优。首先,我需要回忆jstat的功能和常用命令。根据引用[3]和[4],jstat主要用于监控JVM的类加载、内存、垃圾回收等信息,特别是三代内存的使用情况。 我应该先介绍jstat的基本用法,比如命令格式和常用参数。引用[4]提到了jstat -gccapacity <pid>,可以查看各代容量,这需要包括在回答里。另外,引用[3]提到jstat能实时查看内存和GC信息,所以需要说明如何用不同选项监控这些指标。 接下来,用户可能需要具体的监控指标和分析步骤。比如,使用jstat -gcutil查看各代使用百分比,或jstat -gcnew查看新生代GC情况。需要详细解释每个参数的作用,以及如何根据输出判断是否有内存泄漏或GC效率问题。 然后,结合实际调优案例会更有帮助。例如,发现Full GC频繁时,可能需要调整堆大小或优化老年代回收策略。引用[2]提到JVM调优方法论,应该结合性能监控和参数调整策略,比如调整-Xmx或-XX:SurvivorRatio。 需要注意用户可能对JVM内存结构不熟悉,所以解释各代的作用是必要的,比如新生代、老年代和元空间。同时,强调jstat需要结合其他工具如VisualVM和MAT一起使用,如引用[3]所述,提供全面的调优建议。 最后,生成相关问题时要围绕jstat的高级用法、常见问题排查、与其他工具对比,以及调优后的验证方法。确保问题能引导用户深入学习和应用相关知识。</think>### 如何使用jstat进行JVM性能调优 #### 1. **jstat工具简介** jstat是JDK自带的JVM统计监测工具,主要用于实时查看JVM的类加载、内存分配、垃圾回收(GC)等运行状态。通过分析其输出数据,可以快速定位内存泄漏、GC效率低等问题[^3][^4]。 --- #### 2. **基本命令格式** ```bash jstat [options] <pid> [interval] [count] ``` - **`<pid>`**: JVM进程ID(可通过`jps`命令获取) - **`interval`**: 数据采样间隔(单位:毫秒) - **`count`**: 采样次数 --- #### 3. **关键监控指标与参数** | 参数 | 功能说明 | |--------------|-----------------------------------------------------------------------------------| | `-gcutil` | 显示各内存区域使用百分比(**最常用**) | | `-gccapacity`| 显示各内存代(Young/Old/Perm)的容量与使用量 | | `-gcnew` | 监控新生代(Young Gen)的GC行为与对象分配情况 | | `-gcold` | 监控老年代(Old Gen)的内存使用与Full GC情况 | --- #### 4. **调优步骤与示例** **步骤1:查看内存使用概况** ```bash jstat -gcutil <pid> 1000 5 # 每秒采样1次,共5次 ``` 输出示例: ``` S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 99.80 45.32 78.45 94.12 85.23 15 0.250 3 0.980 1.230 ``` - **关键列解析**: - **`E`**:新生代Eden区使用- **`O`**:老年代使用- **`FGC`**:Full GC次数 - **`FGCT`**:Full GC总耗时[^3] **步骤2:分析GC效率问题** - 若**`FGC`频繁且`FGCT`高**:可能老年代内存不足,需调整`-Xmx`(最大堆大小)或优化对象生命周期。 - 若**`E`区使用率长期>90%**:可能新生代过小,需调整`-XX:NewRatio`或`-Xmn`[^2]。 **步骤3:内存泄漏排查** ```bash jstat -gccapacity <pid> ``` - 关注**`OGCMX`(老年代最大容量)与`OGC`(当前老年代容量)**的差值,若持续缩小且`O`区使用率上升,可能存在内存泄漏。 --- #### 5. **调优案例** **场景**:某应用频繁触发Full GC(`FGC=10次/分钟`) - **jstat分析**:`jstat -gcold <pid>`显示老年代使用率`O`在每次Full GC后仅下降5% - **调优措施**: 1. 增大堆大小:`-Xmx4G → -Xmx8G` 2. 优化对象缓存策略,减少长生命周期对象驻留 - **验证结果**:Full GC频率降低至`2次/小时`,`FGCT`减少70% --- #### 6. **注意事项** - 需**结合其他工具**(如`VisualVM`分析对象分布、`MAT`分析堆转储)进行综合诊断 - 监控时间间隔不宜过短(避免影响性能),建议从`1000ms`开始
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值