Jstat使用简介

一、 实践用例:

性能测试过程中,我们该如何监控java虚拟机内存的使用情况,用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。
在项目实践过程中,我们探索和使用了一款新工具--Jstat。
    先秀一下。Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
那,该怎么用呢?
    语法结构如下:jstat [Options] vmid [interval] [count]
    Options — 选项,我们一般使用 -gcutil 查看gc情况
    vmid    — VM的进程号,即当前运行的java进程号
    interval– 间隔时间,单位为秒或者毫秒
    count   — 打印次数,如果缺省则打印无数次
    下面给出一个实际的例子:





 

注:由于JVM内存设置较大,图中百分比变化不太明显

 
    图中参数含义如下:
    S0  — Heap上的 Survivor space 0 区已使用空间的百分比
    S1  — Heap上的 Survivor space 1 区已使用空间的百分比
    E   — Heap上的 Eden space 区已使用空间的百分比
    O   — Heap上的 Old space 区已使用空间的百分比
    P   — Perm space 区已使用空间的百分比
    YGC — 从应用程序启动到采样时发生 Young GC 的次数
    YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
    FGC — 从应用程序启动到采样时发生 Full GC 的次数
    FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
    GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒) 
    上图的示例,红框中,我们可以看到,5次young gc之后,垃圾内存被从Eden space区(E)放入了Old space区(O),并引起了百分比的变化,导致Survivor space使用的百分比从19.69%(S0)降到10.34%(S1)。有效释放了内存空间。绿框中,我们可以看到,一次full gc之后,Old space区(O)的内存被回收,从36.81%降到35.01%。
    图中同时打印了young gc和full gc的总次数、总耗时。而,每次young gc消耗的时间,可以用相间隔的两行YGCT相减得到。每次full gc消耗的时间,可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1次young gc,消耗的时间为52.281-52.252=0.029秒。
    常驻内存区(P)的使用率,始终停留在37.6%左右,说明常驻内存没有突变,比较正常。
如果young gc和full gc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。
    以上,介绍了Jstat按百分比查看gc情况的功能。其实,它还有其它功能,例如加载类信息统计功能、内存池信息统计功能等,那些是以绝对值的形式打印出来的,比较少用,在此就不做介绍。

二、 使用介绍: 
    jstat :对VM内存使用量进行监控。
    jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
    jstat -class pid:显示加载class的数量,及所占空间等信息。
    jstat -compiler pid:显示VM实时编译的数量等信息。
    jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
    jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
    jstat -gcnew pid:new对象的信息。
    jstat -gcnewcapacity pid:new对象的信息及其占用量。
    jstat -gcold pid:old对象的信息。
    jstat -gcoldcapacity pid:old对象的信息及其占用量。
    jstat -gcpermcapacity pid: perm对象的信息及其占用量。
    jstat -util pid:统计gc信息统计。
    jstat -printcompilation pid:当前VM执行的信息。
    除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

<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工具简介** jstatJDK自带的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、付费专栏及课程。

余额充值