JVM调优
一、jstat分析GC
1. 垃圾回收统计
1 |
|
pid 为java进程,1000 为间隔打印时间(ms)
结果列说明:
- S0C 年轻代中第一个survivor的容量 (字节)
- S1C 年轻代中第二个survivor的容量 (字节)
- S0U 年轻代中第一个survivor目前已使用空间 (字节)
- S1U 年轻代中第二个survivor目前已使用空间 (字节)
- EC 年轻代中Eden的容量 (字节)
- EU 年轻代中Eden目前已使用空间 (字节)
- OC Old代的容量 (字节)
- OU Old代目前已使用空间 (字节)
- MC 方法区大小
- MU 方法区目前已使用空间 (字节)
- CCSC 压缩类空间大小
- CCSU 压缩类空间已使用大小
- YGC 从应用程序启动到采样时年轻代中gc次数
- YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
- FGC 从应用程序启动到采样时old代(全gc)gc次数
- FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
- GCT 从应用程序启动到采样时gc用的总时间(s)
2. 总结垃圾回收统计
1 |
|
结果列说明:
- S0 幸存1区当前使用比例
- S1 幸存2区当前使用比例
- E 伊甸园区使用比例
- O 老年代使用比例
- M 元数据区使用比例
- CCS 压缩使用比例
- YGC 年轻代垃圾回收次数
- YGCT 年轻代垃圾回收消耗时间
- FGC 老年代垃圾回收次数
- FGCT 老年代垃圾回收消耗时间
- GCT 垃圾回收消耗总时间
二、JVisualVM
jdk自带jvm可视化工具,路径 JDK_HOME/bin/jvisualvm.exe
三、MemoryAnalyzer
工具下载:下载地址
概念理解
GC Root
GC Root 代表通过可达性分析来判定 JVM 对象是否存活的起始集合。JVM 采用追踪式垃圾回收(Tracing GC)模式,从所有 GC Roots 出发通过引用关系可以关联的对象就是存活的(且不可回收),其余的不可达的对象(Unreachable object:如果无法从 GC Root 找到一条引用路径能到达某对象,则该对象为Unreachable object)可以回收。
Shallow Heap
Shallow Heap 代表一个对象结构自身所占用的内存大小,不包括其属性引用对象所占的内存。如 java.util.ArrayList 对象的 Shallow Heap 包含8字节的对象头、8字节的对象数组属性 elementData 引用 、 4字节的 size 属性、4字节的 modCount 属性(从 AbstractList 继承及对象头占用内存大小),有的对象可能需要加对齐填充但 ArrayList 自身已对齐不需补充,注意不包含 elementData 具体数据占用的内存大小。
Retained Heap:
Retained Heap 是一个对象被 GC 回收后,可释放的内存大小,等于释放对象的 Retained Heap 中所有对象的 Shallow Heap 的和(如下图所示,E 的 Retain Heap 就是 G 与 E 的 Shallow Heap 总和,同理不包含 H)
Dominator tree
如果所有指向对象 Y 的路径都经过对象 X,则 X 支配(dominate) Y(如下图中,C、D 均支配 F,但 G 并不支配 H)。Dominator tree 是根据对象引用及支配关系生成的整体树状图,支配树清晰描述了对象间的依赖关系,下图左的 Dominator tree 如下图右下方支配树示意图所示。支配关系还有如下关系:
- Dominator tree 中任一节点的子树就是被该节点支配的节点集合,也就是其 Retain Set
- 如果 X 直接支配 Y,则 X 的所有支配节点均支配 Y