Java面试题——JVM(8)

G1垃圾收集器(garbage-first)

以前收集器的特点

1、年轻代和老年代是各自独立且连续的内存块
2、年轻代收集器使用 eden + S0 + S1 进行复制算法
3、年代收集必须扫描整个老年代区域
4、都是以尽可能的少而快速地执行 GC 为设计原则

G1 是什么

1、G1 是一种面向服务端的垃圾收集器,应用在多核处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集器的暂停时间要求。
2、像 CMS 收集器一样,能与应用程序线程并发执行,整理空闲空间更快,需要更多的时间来预测 GC 停顿时间,不希望牺牲大量的吞吐性能,不需要更大的 JAVA Heap。
3、G1 收集器的设计目的是取代 CMS 收集器,同时与 CMS 相比,G1 垃圾收集器是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片。G1 的 Stop The World 更可控,G1 在停顿上添加了预测机制,用户可以指定期望的停顿时间。
4、G1 是在 2012 年才在 jdk.1.7u4 中可以呀用,在 jdk9 中将 G1 变成默认垃圾收集器来代替 CMS。它是以款面向服务应用的收集器。
5、主要改变是 Eden、Survivor 和 Tenured 等内存区域不再是连续的,而是变成了一个个大小一样的 region,每个 region 从 1M 到 32M 不等,一个 region 有可能属于 Eden、Survivor 或者 Tenured 内存区域。
Java面试题——JVM(8)_第1张图片

特点

1、G1 能充分利用多 CPU、多核环境硬件优势,尽量缩短 STW。
2、G1 整体采用标记-整理算法,局部是通过是通过复制算法,不会产生内存碎片。
3、宏观上看 G1 之中不在区分年轻代和老年代,被内存划分为多个独立的子区域。
4、G1 收集器里面讲整个的内存区域混合在一起,但其本身依然在小范围内要进行年轻代和老年代的区分。保留了新生代和老年代,但她们不在是物理隔离,而是一部分 Region 的集合且不需要 Region 是连续的,也就是说依然会采用不同的 GC 方式来处理不同的区域。
5、G1 虽然也是分代收集器,但整个内存分区不存在物理上的年轻代和老年代的区别,也不需要完全独立的 Survivor to space 堆做复制准备。G1 只有逻辑上的分代概念,或者说每个分区都可能随 G1 的运行在不同代之间前后切换。

底层原理

Region 区域化垃圾收集器:最大好处是化整为零,避免全内存扫描,只需要按照区域来进行扫描即可。
G1的内存结构和传统的内存空间划分有比较的不同。G1将内存划分成了多个大小相等的Region(默认是512K),Region逻辑上连续,物理内存地址不连续。
Java面试题——JVM(8)_第2张图片
同时每个Region被标记成E、S、O、H,分别表示Eden、Survivor、Old、Humongous。其中E、S属于年轻代,O与H属于老年代。H表示Humongous。从字面上就可以理解表示大的对象(下面简称H对象)。当分配的对象大于等于Region大小的一半的时候就会被认为是巨型对象。H对象默认分配在老年代,可以防止GC的时候大对象的内存拷贝。通过如果发现堆内存容不下H对象的时候,会触发一次GC操作。

Java面试题——JVM(8)_第3张图片
Java面试题——JVM(8)_第4张图片
Java面试题——JVM(8)_第5张图片

过程

常用参数
Java面试题——JVM(8)_第6张图片

与CMS比较的优势

1、G1不会产生内存碎片
2、是可以精确控制停顿。该收集器是把整个堆划分成固定大小的区域,每次允许停顿的时间区收集垃圾最多的区域。

Java面试题——JVM常见面试题目录

你可能感兴趣的:(面试-JVM)