JVM 调优 - jstat

本文详细介绍jstat命令的使用方法,jstat是用于监控虚拟机运行状态的命令行工具,包括类装载、内存、垃圾收集、JIT编译等信息。文章深入解析jstat的参数配置和常见选项,如gcutil、gccapacity等,帮助读者理解和应用。

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

Java命令学习系列(四)——jstat

阿里大牛珍藏架构资料,点击链接免费获取

jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。

 

jstat位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。

jstat 命令格式

 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数解释:

Option — 选项,我们一般使用 -gcutil 查看gc情况

vmid — VM的进程号,即当前运行的java进程号

interval– 间隔时间,单位为秒或者毫秒

count — 打印次数,如果缺省则打印无数次

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程5828垃圾收集状况,一共查询5次,那命令行如下:

jstat -gc 5828 250 5

对于命令格式中的VMIDLVMID需要特别说明下:如果是本地虚拟机进程,VMID(Virtual Machine IDentifier,虚机标识符)和LVMID(Local Virtual Machine IDentifier,虚机标识符)是一致的,如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//] lvmid [@hostname[:port]/servername]

option

选项option代表这用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:

class 监视类装载、卸载数量、总空间及类装载所耗费的时间 –gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量 –gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间 –gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 –gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 –gcnew 监视新生代GC的状况 –gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间 –gcold 监视老年代GC的状况 –gcoldcapacity 监视内容与——gcold基本相同,输出主要关注使用到的最大和最小空间 –gcpermcapacity 输出永久代使用到的最大和最小空间 –compiler 输出JIT编译器编译过的方法、耗时等信息 –printcompilation 输出已经被JIT编译的方法

常见术语

1、jstat –class<pid> : 显示加载class的数量,及所占空间等信息。

Loaded 装载的类的数量 Bytes 装载类所占用的字节数 Unloaded 卸载类的数量 Bytes 卸载类的字节数 Time 装载和卸载类所花费的时间

2、jstat -compiler <pid>显示VM实时编译的数量等信息。

Compiled 编译任务执行数量 Failed 编译任务执行失败数量 Invalid 编译任务执行失效数量 Time 编译任务消耗时间 FailedType 最后一个编译失败任务的类型 FailedMethod 最后一个编译失败任务所在的类及方法

3、jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。

S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC 年轻代中Eden(伊甸园)的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) PC Perm(持久代)的容量 (字节) PU Perm(持久代)目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)

4、jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小

NGCMN 年轻代(young)中初始化(最小)的大小(字节) NGCMX 年轻代(young)的最大容量 (字节) NGC 年轻代(young)中当前的容量 (字节) S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) EC 年轻代中Eden(伊甸园)的容量 (字节) OGCMN old代中初始化(最小)的大小 (字节) OGCMX old代的最大容量(字节) OGC old代当前新生成的容量 (字节) OC Old代的容量 (字节) PGCMN perm代中初始化(最小)的大小 (字节) PGCMX perm代的最大容量 (字节) PGC perm代当前新生成的容量 (字节) PC Perm(持久代)的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数

5、jstat -gcutil <pid>:统计gc信息

S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 E 年轻代中Eden(伊甸园)已使用的占当前容量百分比 O old代已使用的占当前容量百分比 P perm代已使用的占当前容量百分比 YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)

6、jstat -gcnew <pid>:年轻代对象的信息。

S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) TT 持有次数限制 MTT 最大持有次数限制 EC 年轻代中Eden(伊甸园)的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)

7、jstat -gcnewcapacity<pid>: 年轻代对象的信息及其占用量。

NGCMN 年轻代(young)中初始化(最小)的大小(字节) NGCMX 年轻代(young)的最大容量 (字节) NGC 年轻代(young)中当前的容量 (字节) S0CMX 年轻代中第一个survivor(幸存区)的最大容量 (字节) S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1CMX 年轻代中第二个survivor(幸存区)的最大容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) ECMX 年轻代中Eden(伊甸园)的最大容量 (字节) EC 年轻代中Eden(伊甸园)的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数

8、jstat -gcold <pid>:old代对象的信息。

PC Perm(持久代)的容量 (字节) PU Perm(持久代)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)

9、stat -gcoldcapacity <pid>: old代对象的信息及其占用量。

OGCMN old代中初始化(最小)的大小 (字节) OGCMX old代的最大容量(字节) OGC old代当前新生成的容量 (字节) OC Old代的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)

10、jstat -gcpermcapacity<pid>: perm对象的信息及其占用量。

PGCMN perm代中初始化(最小)的大小 (字节) PGCMX perm代的最大容量 (字节) PGC perm代当前新生成的容量 (字节) PC Perm(持久代)的容量 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)

11、jstat -printcompilation <pid>:当前VM执行的信息。

Compiled 编译任务的数目 Size 方法生成的字节码的大小 Type 编译类型 Method 类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的

 

转:https://www.hollischuang.com/archives/481

转载于:https://www.cnblogs.com/jiangtao1218/p/10048964.html

<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、付费专栏及课程。

余额充值