主题
#JVM
jdk自带的工具
jps
jps (Java Virtual Machine Process Status Tool): 用于列出正在运行的 JVM 实例及其相关信息
shell
用法:
命令: jps
参数:
-q 结果只显示jvm id,
-m 显示传递给main方法的参数
-l 显示应用程序主类的完整包名称或应用程序 JAR 文件的完整路径名称。
-v 显示传递给 JVM 的参数。
-V 只显示id 和 方法名 ,和 jps 默认执行类似
例子:
jps 18027 Java2Demo.JAR 18032 jps 18005 jstat
jps -l remote.domain 3002 /opt/jdk1.7.0/demo/jfc/Java2D/Java2Demo.JAR 2857 sun.tools.jstatd.jstatd
jps -m remote.domain:2002 3002 /opt/jdk1.7.0/demo/jfc/Java2D/Java2Demo.JAR 3102 sun.tools.jstatd.jstatd -p 2002
jstat
jstat (JVM Statistics Monitoring Tool): 用于监控 JVM 的各种运行时统计信息,例如垃圾收集、类加载等。
描述:
Jstat 命令显示已检测的 JavaHotSpot VM 的性能统计数据。目标 JVM 由其虚拟机标识符或 vmid 选项标识。
用法:
jstat generalOptions
jstat outputOptions [-t] [-h lines] vmid [interval [count]]
**generalOptions** 单个常规命令行选项outputOptions 通过 jstat -options可以查看具体有哪些选项,参收后面介绍
-t 将时间戳列显示为输出的第一列。时间戳是从目标 JVM 开始到现在的时间
-h n 每 n 个示例(输出行)显示一个列标题,其中 n 是一个正整数。默认值为0,它显示第一行数据的列标题。
vmid 虚拟机标识符,它是指示目标 JVM 的字符串。参见虚拟机标识符。
interval 以指定单位、秒或毫秒为单位的采样间隔。默认单位是毫秒。这必须是一个正整数。指定时,jstat 命令每隔一段时间生成一次输出。
count 要显示的示例数。默认值是无穷大,这会导致 jstat 命令显示统计信息,直到目标 JVM 终止或 jstat 命令终止。此值必须为正整数。
generalOptions
markdown
这个只有两个参数,一个是help ,一个是options
如果指定一个常规选项,则不能指定任何其他选项或参数。
`-help` 查看帮助,不用多说
`-options` 查看所有可用的选项参数,和上面不一样,具体参数,下面介绍
outputOptions
查看所有选项
shell
root@iZuf6jan0ceb3gi12hemq4Z:~# jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
-class 选项
markdown
类加载统计
`Loaded`: 加载的类的个数.
`Bytes`: 加载的类的大小 KB.
`Unloaded`: 未加载的类的个数.
`Bytes`: 未加载的类的大小 KB.
`Time`: 执行类加载和卸载操作所花费的时间。
-compiler 选项
markdown
即时编译器统计数据。
`Compiled`:执行的编译任务数。
`Failed`: 编译任务失败的数量。
`Invalid`: 无效的编译任务数。
`Time`: 执行编译任务所花费的时间。
`FailedType`:上次失败编译的编译类型。
`FailedMethod`: 上次失败编译的类名和方法。
-gc 选项
markdown
这个最常用
垃圾收集的堆统计信息。
`S0C`: 当前s0 空间的容量 (KB).
`S1C`: 当前s1 空间的容量(KB).
`S0U`: S0空间的使用率 (KB).
`S1U`: S1空间的使用率 (KB).
`EC`: 当前eden空间容量 (KB).
`EU`: Eden 空间使用率 (KB).
`OC`: 当前老年代空间容量 (KB).
`OU`: 老年代空间使用 (KB).
`MC`: 元空间提交大小 Size (KB).
`MU`: 元空间已使用使用 (KB).
`CCSC`: 压缩的类提交大小 (KB).
`CCSU`: 使用的压缩类空间( (KB).
`YGC`:年轻代垃圾收集(GC)事件的数量。
`YGCT`: 年轻代垃圾收集时间。
`FGC`: full GC 时间数量.
`FGCT`: Full gc 垃圾收集时间.
`GCT`: 垃圾手机总时间。
Compressed class space 是什么
markdown
`Compressed Class Space` 是 Java 8 及以后版本中的一个概念,与 `Compressed Oops`(Compressed Ordinary Object Pointers,压缩普通对象指针)相关。它是用于存储类元数据的一个专门区域,在 64 位 JVM 中引入,用于减少内存占用和提高性能。
在 Java 8 之前,类的元数据(Class Metadata)存储在永久代(PermGen)中。但是从 Java 8 开始,永久代被移除,类元数据被转移到 Metaspace 中。Metaspace 使用本地内存,而不是像永久代那样使用堆内存。
为了进一步优化内存使用,JVM 引入了 `Compressed Class Space`,这是一个用于存储类元数据的专用区域。启用 `Compressed Oops` 后,类指针可以被压缩为 32 位,以减少内存消耗,提高指针操作的效率。具体来说,`Compressed Class Space` 是 `Metaspace` 的一部分,专门用于存储类元数据的压缩指针。
### 配置和调优
`Compressed Class Space` 是 JVM 自动管理的,通常不需要手动配置。但如果需要调整其大小,可以使用以下 JVM 参数:
- `-XX:CompressedClassSpaceSize=<size>`: 设置 `Compressed Class Space` 的初始大小。
- `-XX:MaxMetaspaceSize=<size>`: 设置 Metaspace 的最大大小。
例如:
java -XX:CompressedClassSpaceSize=128m -XX:MaxMetaspaceSize=512m -jar myapp.jar
### 查看 `Compressed Class Space` 的使用情况
可以使用 `jcmd` 工具查看 `Compressed Class Space` 的使用情况。例如:
jcmd <pid> VM.native_memory summary
这会输出 JVM 的本地内存使用情况,包括 `Compressed Class Space` 的使用信息。
-gccapacity 选项
markdown
内存池生成和空间容量。
`NGCMN`: 新生代最小容量 (KB).
`NGCMX`: 新生代最大容量(KB).
`NGC`: 当前新生代容量 (KB).
`S0C`: 当前S0容量(KB).
`S1C`: 当前S1容量 (KB).
`EC`: 当前eden 空间容量 (KB).
`OGCMN`: Minimum old generation capacity (KB).
`OGCMX`: Maximum old generation capacity (KB).
`OGC`: Current old generation capacity (KB).
`OC`: Current old space capacity (KB).
`MCMN`: 元空间最小容量(KB).
`MCMX`: 元空间最大容量 (KB).
`MC`: 元空间提交大小 (KB).
`CCSMN`: 压缩类空间最小容量 (KB).
`CCSMX`: 压缩类空间最大容量 (KB).
`CCSC`: 压缩的类提交大小 (KB).
`YGC`: 年轻代 GC 事件的数量.
`FGC`: full gc 的事件数量.
这里有两个概念,我使用了英文,因为中文无法体会其中的区别。
- Old Generation: 一般指堆内存中存储生命周期较长对象的区域,适用于大多数垃圾收集器的通用术语。
- Old Space: 特定于某些垃圾收集器(如 G1)中的术语,用于描述分配给老年代的内存区域。
-gccause 选项
markdown
此选项显示与 -gcutil 选项相同的垃圾收集统计信息摘要,但包括上次垃圾收集事件的原因和(如果适用)当前垃圾收集事件。除了为 -gcutil 列出的列之外,此选项还添加以下列:
`LGCC`: 上次垃圾回收的原因
`GCC`: 当前垃圾回收的原因
-gcnew 选项
markdown
新生代统计数据
`S0C`: 当前s0 空间的容量 (KB).
`S1C`: 当前s1 空间的容量 (KB).
`S0U`: S0空间的使用率 (KB).
`S1U`: S1空间的使用率 (KB).
`TT`: (Tenuring threshold)从年轻代到老年代所需的垃圾收集次数.
`MTT`: 最大TT.
`DSS`: 期望幸存区空间 (KB).
`EC`: 当前 eden space 容量 (KB).
`EU`: Eden space 使用率 (KB).
`YGC`: 新生代垃圾收集次数.
`YGCT`: 新生代垃圾收集时间.
DSS是什么
markdown
`Desired Survivor Size`(DSS) 是 JVM 中用于描述期望的幸存区(Survivor Space)大小的参数。在垃圾回收过程中,JVM 会根据当前的内存使用情况和对象存活率来动态调整幸存区的大小,以优化内存管理和垃圾回收的性能。
### 详细解释
#### 幸存区(Survivor Space)
在年轻代(Young Generation)中,内存通常分为三个部分:`Eden` 区和两个 `Survivor` 区(S0 和 S1)。对象在 `Eden` 区创建,当发生年轻代垃圾回收(Young GC)时,存活的对象会被复制到一个 `Survivor` 区(例如,从 S0 到 S1),并且每次对象被复制时,其年龄(tenure)会增加。
#### Desired Survivor Size 的作用
`Desired Survivor Size` 是 JVM 为幸存区设定的目标大小。这个大小并不是一个固定值,而是根据垃圾回收过程中的观察和统计动态调整的。具体来说,JVM 会根据对象在幸存区中的存活率,计算出一个理想的幸存区大小,以确保幸存区能够容纳所有存活的对象,同时最大限度地减少内存浪费和垃圾回收的频率。
### 计算与调整
在每次垃圾回收过程中,JVM 会统计从 `Eden` 区和一个 `Survivor` 区复制到另一个 `Survivor` 区的对象数量和大小。根据这些数据,JVM 会计算出下次垃圾回收时所需的幸存区大小,即 `Desired Survivor Size`。这个值会作为下次垃圾回收时的目标大小,指导内存分配和回收策略的调整。
### 配置参数
尽管 `Desired Survivor Size` 是 JVM 动态计算和调整的,但可以通过一些 JVM 参数来影响幸存区的大小和行为,例如:
- `-XX:TargetSurvivorRatio=<value>`:设置目标幸存区使用率(百分比)。这个参数影响 `Desired Survivor Size` 的计算。
- 例如,`-XX:TargetSurvivorRatio=50` 表示目标幸存区使用率为 50%。
- `-XX:SurvivorRatio=<value>`:设置 `Eden` 区和一个 `Survivor` 区的大小比率。
- 例如,`-XX:SurvivorRatio=8` 表示 `Eden` 区的大小是每个 `Survivor` 区的 8 倍。
### 示例
假设 JVM 通过观察发现,当前幸存区的使用率低于 `TargetSurvivorRatio`,则会减少 `Desired Survivor Size` 以减少内存浪费;反之,如果使用率高于 `TargetSurvivorRatio`,则会增加 `Desired Survivor Size` 以确保能够容纳更多的存活对象。
### 总结
`Desired Survivor Size` 是 JVM 为幸存区动态设定的目标大小,用于优化内存管理和垃圾回收的效率。通过合理的计算和调整,可以确保幸存区能够容纳所有存活对象,减少垃圾回收频率,提高 JVM 性能。
-gcnewcapacity 选项
markdown
新一代空间大小统计。
`NGCMN`: Minimum new generation capacity (KB).
`NGCMX`: Maximum new generation capacity (KB).
`NGC`: Current new generation capacity (KB).
`S0CMX`: Maximum survivor space 0 capacity (KB).
`S0C`: Current survivor space 0 capacity (KB).
`S1CMX`: Maximum survivor space 1 capacity (KB).
`S1C`: Current survivor space 1 capacity (KB).
`ECMX`: Maximum eden space capacity (KB).
`EC`: Current eden space capacity (KB).
`YGC`: Number of young generation GC events.
`FGC`: Number of full GC events.
-gcold 选项
markdown
Old generation size statistics.
`MC`: Metaspace Committed Size (KB).
`MU`: Metaspace utilization (KB).
`CCSC`: Compressed class committed size (KB).
`CCSU`: Compressed class space used (KB).
`OC`: Current old space capacity (KB).
`OU`: Old space utilization (KB).
`YGC`: Number of young generation GC events.
`FGC`: Number of full GC events.
`FGCT`: Full garbage collection time.
`GCT`: Total garbage collection time.
-gcoldcapacity 选项
Old generation statistics.
OGCMN
: Minimum old generation capacity (KB).
OGCMX
: Maximum old generation capacity (KB).
OGC
: Current old generation capacity (KB).
OC
: Current old space capacity (KB).
YGC
: Number of young generation GC events.
FGC
: Number of full GC events.
FGCT
: Full garbage collection time.
GCT
: Total garbage collection time.
-gcmetacapacity 选项
Metaspace size statistics.
MCMN
: Minimum metaspace capacity (KB).
MCMX
: Maximum metaspace capacity (KB).
MC
: Metaspace Committed Size (KB).
CCSMN
: Compressed class space minimum capacity (KB).
CCSMX
: Compressed class space maximum capacity (KB).
YGC
: Number of young generation GC events.
FGC
: Number of full GC events.
FGCT
: Full garbage collection time.
GCT
: Total garbage collection time.
-gcutil 选项
垃圾回收统计概述
S0
: Survivor space 0 utilization as a percentage of the space's current capacity.
S1
: Survivor space 1 utilization as a percentage of the space's current capacity.
E
: Eden space utilization as a percentage of the space's current capacity.
O
: Old space utilization as a percentage of the space's current capacity.
M
: Metaspace utilization as a percentage of the space's current capacity.
CCS
: Compressed class space utilization as a percentage.
YGC
: Number of young generation GC events.
YGCT
: Young generation garbage collection time.
FGC
: Number of full GC events.
FGCT
: Full garbage collection time.
GCT
: Total garbage collection time.
-printcompilation 选项
Java HotSpot VM compiler method statistics.
Compiled
: Number of compilation tasks performed by the most recently compiled method.
Size
: Number of bytes of byte code of the most recently compiled method.
Type
: Compilation type of the most recently compiled method.
Method
: Class name and method name identifying the most recently compiled method. Class name uses a slash (/) instead of a dot (.) as a name space separator. The method name is the method within the specified class. The format for these two fields is consistent with the HotSpot -XX:+PrintCompilation
option.
jstack
jstack (Stack Trace Tool): 用于打印线程的堆栈快照,分析线程状态和死锁问题。
jmap
jmap (Memory Map Tool): 用于生成堆转储、打印堆的各种统计信息,分析内存使用情况。
jcmd
jcmd (JVM Diagnostic Command Tool): 多功能诊断工具,可以用来执行多种 JVM 诊断命令,如 GC、堆转储、线程转储等
jinfo
jinfo (Configuration Info Tool): 用于打印配置信息和 JVM 参数信息
第三方jvm调优工具
MAT
MAT (Memory Analyzer Tool): 一个强大的 Eclipse 插件,用于分析 Java 堆转储文件,查找内存泄漏和内存使用问题。