jvm - GC垃圾回收器(二) G1垃圾回收器

???G1垃圾回收器和CMS垃圾回收器有什么区别?
G1横跨young old两区(证明:-XX:PrintGCDetails -XX:UseG1GC   ,在输出中只能看到garbage first heap和Metaspace,看不到young、old),而CMS用于老年代;
CMS采用老年代采用标记清除,而G1整体上采用标记整理,局部采用复制算法,不会产生内存碎片;

在IDEA配置JVM参数:

jvm - GC垃圾回收器(二) G1垃圾回收器

结果:

jvm - GC垃圾回收器(二) G1垃圾回收器

只有两层,新生代+老年代被grabage-first heap一次性拿下(证明了: G1横跨young old两区)

jvm - GC垃圾回收器(二) G1垃圾回收器

 

jvm - GC垃圾回收器(二) G1垃圾回收器

jvm - GC垃圾回收器(二) G1垃圾回收器

jvm - GC垃圾回收器(二) G1垃圾回收器

底层原理:
G1是区域化的垃圾收集器,最大好处是化整为零,避免全内存扫描,只需要按照区域来进行扫描即可。

jvm - GC垃圾回收器(二) G1垃圾回收器

 

jvm - GC垃圾回收器(二) G1垃圾回收器

jvm - GC垃圾回收器(二) G1垃圾回收器

 

G1的回收步骤:

jvm - GC垃圾回收器(二) G1垃圾回收器


四步过程,和CMS类似:

jvm - GC垃圾回收器(二) G1垃圾回收器

jvm - GC垃圾回收器(二) G1垃圾回收器

常用参数配置:

jvm - GC垃圾回收器(二) G1垃圾回收器

G1的STW更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿的时间。

 

一般设置下面几个参数就够了:

jvm - GC垃圾回收器(二) G1垃圾回收器

G1和CMS相比:
CMS会产生内存碎片是因为它在老年代使用标清算法,没有整理,所以会产生碎片,
而G1整体采用标整,局部采用复制,不会产生碎片。

jvm - GC垃圾回收器(二) G1垃圾回收器