概述
上一章我们说了,G1收集器,它属于里程碑式的发展,开创了面向局部收集垃圾的概念。专门针对多核处理器以及大内存的机器。在JDK9中,更是呗指定为官方的GC收集器。满足高吞吐的通知满足GC的STW停顿时间尽可能的短。
虽然现在我们看来这种“化整为零”的解题思路没有多大的创新,也很好理解,但是在运行的时候其实有很多问题。 包括但不限于如下:
- 多个Region,对于那些跨区引用对象如何解决?
- 并发标记的时候,怎么保证收集线程和用户线程并行?收集过程中用户改变了对象的引用关系怎么办?
- 如何预测停顿时间?
下面我们先来完整的了解一下,然后再解答上面的问题。
分区原理
使用G1收集器时,它将整个Java堆划分成约2048个⼤⼩相同的独立Region块,每个Region块大小根据堆空间的实际大小而定,整体被控制在1MB到32MB之间,且为2的N次幂,即1MB, 2MB, 4MB, 8MB, 16MB, 32MB。
可以通过-XX:G1HeapRegionSize设定。所有的Region大小相同,且在JVM⽣命周期内不会被改变。
虽然还保留着新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region (不需要连续)的集合。通过Region的动态分配方式实现逻辑上的连续。

⼀个region(分区)只能属于⼀个角色,有可能为eden区、S区、老年代等, E表示为Eden区、S区表示为S1,S0区,老年代O区 空白的表示为未使用的分配的内存。H区存放巨型对象
巨型对象
在G1收集器中也有⼀个新的内存区域,称作为:Humongous (H)区(巨型对象),主要存放⼀些比较大的对象,⼀个对象大于region的⼀半时,称之

最低0.47元/天 解锁文章
1872

被折叠的 条评论
为什么被折叠?



