jvm面试宝典
jstat简介
jstat
(Java Virtual Machine Statistics Monitoring Tool) 是用于监控和分析 Java 虚拟机 (JVM) 性能的工具。它提供了 JVM 的运行时信息,比如垃圾收集的状态、内存使用情况、类加载信息等。jstat
是 JDK 中自带的命令行工具,可以帮助开发者和运维人员排查和优化 JVM 性能问题。
jstat 命令的基本语法为:
jstat [option] [vmid] [interval] [count]
- option:指定要查看的统计信息类型。
- vmid:JVM 实例的进程 ID(PID)。
- interval(可选):每次输出的时间间隔(单位:毫秒)。
- count(可选):输出的次数。
常用选项
-class
:显示类加载的相关统计信息,包括类的装载、卸载数量,以及类占用的内存。-compiler
:显示 JIT 编译器的相关统计信息,包括编译任务的数量、花费的时间等。-gc
:显示垃圾收集相关的统计信息,包括堆内存的使用情况,YGC(Young Generation GC)和 FGC(Full GC)的次数和时间。-gccapacity
:显示堆内存中各个区域(Eden、Survivor、Old)的容量和使用情况。-gcnew
:显示新生代(Young Generation)的垃圾收集信息,包括 Eden 和 Survivor 区的使用情况。-gcold
:显示老年代(Old Generation)的垃圾收集信息,包括老年代的容量和使用情况。-gcutil
:显示堆内存的总体使用情况,以及 YGC 和 FGC 的次数和时间(常用于查看堆内存使用效率)。-printcompilation
:显示 JIT 编译的相关信息,包括已编译的方法等。
输出详解
1. jstat -class
显示类加载信息。
示例输出:
Loaded Bytes Unloaded Bytes Time
2500 2.4M 500 1.2M 2.34
- Loaded: 已加载的类数量。
- Bytes: 已加载类所占的字节数。
- Unloaded: 已卸载的类数量。
- Bytes: 已卸载类释放的字节数。
- Time: 类加载和卸载所花费的总时间(秒)。
2. jstat -gc
显示垃圾收集(GC)相关的信息。
示例输出:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 0.0 240.0 1024.0 480.0 2048.0 1024.0 448.0 400.0 64.0 48.0 12 0.025 1 0.150 0.175
- S0C: 第一个 Survivor 区的容量 (KB)。
- S1C: 第二个 Survivor 区的容量 (KB)。
- S0U: 第一个 Survivor 区的使用量 (KB)。
- S1U: 第二个 Survivor 区的使用量 (KB)。
- EC: Eden 区的容量 (KB)。
- EU: Eden 区的使用量 (KB)。
- OC: 老年代(Old Generation)的容量 (KB)。
- OU: 老年代的使用量 (KB)。
- MC: Metaspace(方法区)的容量 (KB)。
- MU: Metaspace 的使用量 (KB)。
- CCSC: 压缩类空间(Compressed Class Space)的容量 (KB)。
- CCSU: 压缩类空间的使用量 (KB)。
- YGC: 年轻代(Young Generation)GC 的次数。
- YGCT: 年轻代 GC 总时间(秒)。
- FGC: 老年代(Full GC)的次数。
- FGCT: Full GC 总时间(秒)。
- GCT: GC 总时间(秒)。
3. jstat -gcutil
显示垃圾收集活动期间各代(新生代和老年代)的使用百分比。
示例输出:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 75.00 47.14 50.00 89.12 50.23 12 0.025 1 0.150 0.175
- S0: 第一个 Survivor 区的使用百分比。
- S1: 第二个 Survivor 区的使用百分比。
- E: Eden 区的使用百分比。
- O: 老年代的使用百分比。
- M: Metaspace 的使用百分比。
- CCS: 压缩类空间的使用百分比。
- YGC: 年轻代 GC 的次数。
- YGCT: 年轻代 GC 的总时间(秒)。
- FGC: Full GC 的次数。
- FGCT: Full GC 的总时间(秒)。
- GCT: GC 的总时间(秒)。
4. jstat -gccapacity
显示堆内存各个区域的容量信息。
示例输出:
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC
1024.0 4096.0 2048.0 512.0 512.0 1024.0 2048.0 8192.0 4096.0 4096.0
- NGCMN: 新生代(Young Generation)的最小容量。
- NGCMX: 新生代的最大容量。
- NGC: 新生代的当前容量。
- S0C: 第一个 Survivor 区的当前容量。
- S1C: 第二个 Survivor 区的当前容量。
- EC: Eden 区的当前容量。
- OGCMN: 老年代的最小容量。
- OGCMX: 老年代的最大容量。
- OGC: 老年代的当前容量。
- OC: 老年代的总容量。
5. jstat -gcnew
显示新生代(Young Generation)的垃圾收集信息。
示例输出:
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
512.0 512.0 0.0 240.0 12 15 512.0 1024.0 480.0 12 0.025
- TT: 在下次垃圾收集前的
Tenuring Threshold
(晋升阈值)。 - MTT: 自 JVM 启动以来的最大
Tenuring Threshold
。 - DSS: 期望的 Survivor 区大小。
6. jstat -printcompilation
显示即时编译器(JIT)编译的相关信息。
示例输出:
Compiled Size Type Method
1234 5678 1 java/lang/String.charAt(I)C
- Compiled: 已编译的方法数量。
- Size: 已编译代码占用的字节数。
- Type: 编译类型(0 表示不在用,1 表示标准编译,2 表示 OSR 编译)。
- Method: 方法的全限定名。
7. jstat -compiler
显示即时编译器(JIT)的总体统计信息。
示例输出:
Compiled Failed Invalid Time FailedType FailedMethod
1234 0 0 12.34 0 None
- Compiled: 已编译的方法数量。
- Failed: 编译失败的方法数量。
- Invalid: 编译无效的方法数量。
- Time: 编译总时间(秒)。
- FailedType: 最后一次编译失败的类型。
- FailedMethod: 最后一次编译失败的方法的全限定名。