G1 收集器不区分年轻代或老年代,所有的堆内存就是一块。但是会划分出不同的子区域。
虽然在G1收集器里面将整个内存区域都混合在了一起,但是其本身在小范围内依然进行了年轻代和老年代的区分,就是说依然会采用不同的GC策略来处理不同的内存域。
G1 回收流程:
年轻代的处理流程
- 1、先对内存空间进行子区域划分。
- 2、对子区域中需要清理(包括一些满的,未满的子区域)的年轻代内存空间进行标记。
- 3、对被标记的区域进行清空,一些年轻代中继续使用的对象copy到老年代中。
总结:所有的垃圾内存的保存区域有可能会被清空后重新分配。
老年代的处理流程
任何时候如果想要标注老年代的垃圾内存空间,都需要进行一些暂停操作,而G1的最大好处在于它不用进行全内存扫描,只需要按照区域来进行扫描。
- 1、先对内存空间进行子区域划分并标记。
- 2、然后进行根区域扫描,对子区域中需要清理的老年代内存空间进行并发标记。
- 3、然后进行重新标记,这个时候会清理并发标记阶段被标记的内存空间。
- 4、重新标记之后,还要对一些年轻代内存空间使用年轻代的G1处理流程进行清理。
- 5、在使用年轻代的处理流程之后,将内存空间重新整理分配,这样整个内存空间就被很高效的清理。
G1收集器参数配置
观察G1回收操作:
// 测试代码
public static void main(String[] args) {
String str = "ShowG1GC";
while (true) {
str += str;
str.intern();
}
}
VM参数:-Xmx10m -Xms10m -XX:+UseG1GC -XX:+PrintGCDetails
运行结果:从下面运行结果可以观察出G1回收器的大概流程。
[GC pause (G1 Humongous Allocation) (young) (initial-mark) (to-space exhausted), 0.0039032 secs]
[Parallel Time: 2.5 ms, GC Workers: 8]
[GC Worker Start (ms): Min: 201.6, Avg: 201.7, Max: 202.0, Diff: 0.3]
[Ext Root Scanning (ms): Min: 0.2, Avg: 0.4, Max: 0.9, Diff: 0.7, Sum: 3.4]
[Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Processed Buffers: Min: 0, Avg: 0.0, Max: 0, Diff: 0, Sum: 0]
[Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Object Copy (ms): Min: 1.5, Avg: 1.8, Max: 2.0, Diff: 0.5, Sum: 14.4]
[Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.2]
[Termination Attempts: Min: 1, Avg: 2.1, Max: 4, Diff: 3, Sum: 17]
[GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.3, Sum: 0.8]
[GC Worker Total (ms): Min: 2.1, Avg: 2.4, Max: 2.4, Diff: 0.3, Sum: 18.9]
[GC Worker End (ms): Min: 204.1, Avg: 204.1, Max: 204.1, Diff: 0.0]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.1 ms]
[Other: 1.4 ms]
[Evacuation Failure: 1.2 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.1 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.0 ms]
[Humongous Register: 0.0 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 0.0 ms]
[Eden: 4096.0K(6144.0K)->0.0B(1024.0K) Survivors: 0.0B->1024.0K Heap: 6400.1K(10.0M)->5632.0K(10.0M)]
[Times: user=0.02 sys=0.00, real=0.00 secs]
[GC concurrent-root-region-scan-start]
[GC pause (G1 Humongous Allocation) (young)[GC concurrent-root-region-scan-end, 0.0006530 secs]
[GC concurrent-mark-start]
, 0.0018286 secs]
[Root Region Scan Waiting: 0.6 ms]
[Parallel Time: 1.0 ms, GC Workers: 8]
[GC Worker Start (ms): Min: 206.3, Avg: 206.6, Max: 207.2, Diff: 0.9]
[Ext Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.9]
[Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.4, Sum: 1.0]
[Processed Buffers: Min: 0, Avg: 0.5, Max: 1, Diff: 1, Sum: 4]
[Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
[Object Copy (ms): Min: 0.0, Avg: 0.4, Max: 0.7, Diff: 0.7, Sum: 3.0]
[Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.5]
[Termination Attempts: Min: 1, Avg: 8.8, Max: 18, Diff: 17, Sum: 70]
[GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1]
[GC Worker Total (ms): Min: 0.0, Avg: 0.7, Max: 0.9, Diff: 0.9, Sum: 5.4]
[GC Worker End (ms): Min: 207.2, Avg: 207.2, Max: 207.3, Diff: 0.0]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.1 ms]
[Other: 0.2 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.1 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.0 ms]
[Humongous Register: 0.0 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 0.0 ms]
[Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 1024.0K->0.0B Heap: 5632.0K(10.0M)->5636.5K(10.0M)]
[Times: user=0.00 sys=0.00, real=0.00 secs]
[GC concurrent-mark-end, 0.0020078 secs]
[GC remark [Finalize Marking, 0.0001069 secs] [GC ref-proc, 0.0001377 secs] [Unloading, 0.0005376 secs], 0.0008904 secs]
[Times: user=0.00 sys=0.00, real=0.00 secs]
[GC pause (G1 Evacuation Pause) (young), 0.0006539 secs]
[Parallel Time: 0.4 ms, GC Workers: 8]
[GC Worker Start (ms): Min: 212.3, Avg: 212.4, Max: 212.5, Diff: 0.2]
[Ext Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.7]
[Update RS (ms): Min: 0.0, Avg: 0.1, Max: 0.3, Diff: 0.3, Sum: 1.0]
[Processed Buffers: Min: 0, Avg: 0.9, Max: 1, Diff: 1, Sum: 7]
[Scan RS (ms): Min: 0.0, Avg: 0.0, Max: