一、什么是G1
二、G1的三种垃圾回收方式
region默认2048
三、YGC的过程(Step1)
3.1相关代码
public class YGC1 {
/*
-Xmx128M -XX:+UseG1GC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -
XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest
128m
5% 60%
6.4M 75M
*/
private static final int size = 1024 * 256;
public static void main(String[] args) {
byte[] data = new byte[1024 * 256];
for (int i = 0; i < 100; i++) {
data = new byte[1024 * 256];
}
}
}
这里Egen区会扩容,多次垃圾回收会 25M -> 75M
0.147: [GC pause (G1 Evacuation Pause) (young), 0.0027754 secs]
[Parallel Time: 1.3 ms, GC Workers: 10]
[GC Worker Start (ms): 147.4 147.4 147.4 147.4 147.4 147.9 147.9 148.3 148.3 148.4
Min: 147.4, Avg: 147.8, Max: 148.4, Diff: 1.0]
[Ext Root Scanning (ms): 0.4 0.3 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.4, Sum: 1.1]
[Thread Roots (ms): 0.4 0.0 0.1 0.1 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.4, Sum: 0.5]
[StringTable Roots (ms): 0.0 0.0 0.1 0.1 0.1 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3]
[Universe Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[JNI Handles Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[ObjectSynchronizer Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[FlatProfiler Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Management Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[SystemDictionary Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[CLDG Roots (ms): 0.0 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.3, Diff: 0.3, Sum: 0.3]
[JVMTI Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[CodeCache Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[CM RefProcessor Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Wait For Strong CLD (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Weak CLD Roots (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[SATB Filtering (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Update RS (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Processed Buffers: 0 0 0 0 0 0 0 0 0 0
Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0]
[Scan RS (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Code Root Scanning (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Object Copy (ms): 0.5 0.6 0.7 0.7 0.7 0.4 0.4 0.0 0.0 0.0
Min: 0.0, Avg: 0.4, Max: 0.7, Diff: 0.7, Sum: 3.9]
[Termination (ms): 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.0 0.0 0.0
Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.9]
[Termination Attempts: 5 2 3 4 3 3 4 1 1 1
Min: 1, Avg: 2.7, Max: 5, Diff: 4, Sum: 27]
[GC Worker Other (ms): 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.3]
[GC Worker Total (ms): 1.0 1.0 1.0 1.0 1.0 0.6 0.6 0.1 0.1 0.0
Min: 0.0, Avg: 0.6, Max: 1.0, Diff: 1.0, Sum: 6.3]
[GC Worker End (ms): 148.4 148.4 148.4 148.4 148.4 148.4 148.5 148.4 148.4 148.4
Min: 148.4, Avg: 148.4, Max: 148.5, Diff: 0.1]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.4 ms]
[Other: 1.1 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.6 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.3 ms]
[Parallel Redirty: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Redirtied Cards: 0 0 0 0 0 0 0 0 0 0
Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0]
[Humongous Register: 0.0 ms]
[Humongous Total: 0]
[Humongous Candidate: 0]
[Humongous Reclaim: 0.0 ms]
[Humongous Reclaimed: 0]
[Free CSet: 0.0 ms]
[Young Free CSet: 0.0 ms]
[Non-Young Free CSet: 0.0 ms]
[Eden: 24576.0K(24576.0K)->0.0B(37888.0K) Survivors: 0.0B->2048.0K Heap: 24576.0K(128.0M)->1152.0K(128.0M)]
[Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
garbage-first heap total 131072K, used 13440K [0x00000000f8000000, 0x00000000f8100400, 0x0000000100000000)
region size 1024K, 15 young (15360K), 2 survivors (2048K)
Metaspace used 3458K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 370K, capacity 388K, committed 512K, reserved 1048576K
3.2停顿预测模型与垃圾回收区域选择
-XX:MaxGCPauseMillis=1
最大停顿时间1ms
Eden区域 大小从 6M 缩小到5M 尽可能满足,停顿时间
3.2.1 如何判断先回收哪个区域
垃圾数量占Regen的百分比,优先gc百分比高的
3.2.2停顿预测模型
可以手动指定,G1会尽可能满足,默认是根据**响应时间优先算法来决定 **根据前面gc的时间整体判断这次的时间
四、MixGC的过程(Step2)
1. 初始标记阶段_1
2. 并发标记_2
3. 再标记阶段_3
4. 统计对象计数_4
整理统计每个regen里面垃圾的占比,并且排序
5. 垃圾回收_5
根据上一步算出来的gc顺序进行gc
6. 完整回收流程
6.1 为什么并发标记之前有一次YGC
YGC之后,将整理后的S区整合,清理掉不用的Eden区,根据这个S区开始作为根的一部分进行扫描
6.2 为什么混合回收会多次进行
- 混合回收多次执行 为了符合 停顿预测模型的时间
- 混合回收之前的YGC 为了回收的时候年轻代"干净";
垃圾占Regen 少于 15% 就不会被统计
判断GC之后 可回收空间>5% 才会执行
最多这个流程分成8次,为了符合停顿时间
五FullGC的过程(Step3)
5.1 什么情况下触发FullGC
5.2 FullGC具体过程
5.2.1FullGC如何复制对象
使用标记压缩
5.2.2 标记活跃对象(Step1)
5.2.3 计算引用对象地址(Step2)
计算gc之后存活对象所处的位置
5.2.4 更新引用对象地址(Step3)
遍历所有存活对象,告诉他们去的地址
5.2.5 复制对象(Step4)
使用标记压缩
5.2.6 复制后的处理(Step5)
5.3 大对象怎么存储呢?
默认使用多个region来存储,并且直接进入老年代,使得老年代回收变得非常慢
解决方案: 大对象不要进入老年代,不行就手动加大region大小
public class HE {
/*
-Xmx128M -XX:+UseG1GC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
-XX:G1HeapRegionSize=4M 手动指定region大小
128m
5% 60%
6.4M 75M
*/
private static final int size = 1024 * 4096;
public static void main(String[] args) {
byte[] data = new byte[1022 * 4096];
for (int i = 0; i < 50; i++) {
data = new byte[1022 * 4096];
}
}
}