Appearance
为什么使用G1?
- 在G1之前,垃圾回收器停止工作线程STW的时间是不可控的,停多久没人知道,C1就是为了解决这种问题,针对STW可以自定义停多久,默认是200ms
- 解决内存碎片化问题
- 例如
cms
使用标记-清除算法会产生内存碎片,需要专门解决。 - G1采用”整体+局部"的设计方式避免内存碎片化
- 整体:基于标记-整理实现垃圾回收
- 局部:把整个堆切割为大小均匀的多个Region,Region间使用标记-复制算法,详见后文
- 例如
- 年轻代老年代通吃:以往jvm的垃圾回收都要分别为年轻代、老年代分别设置垃圾回收器,从G1开始就不用了
- 建议使用在大应用上,服务器配置一般要求内存大于4G
G1的内存模型
G1的内存模型有几个重要的概念:
- 分区Region:G1把堆内存分割为多个大小相等的独立区域(Region),每个Region都可以根据需要,扮演年轻代或老年代角色。
- CardTable技术:每个Region中都有一个cardTable,记录着堆内存的内存分配情况,通过CardTable可以找到Region内对象所引用的对象,被引用的对象可以是别的Region。
- RSet:每个Region都有一个RSet集合,通过RSet可以找到当前Region内对象被谁所引用,以此判断其是否存活。
- CSet:CSet用于存储不存活的对象,年轻代收集CSet只容纳年轻代分区,混合收集会通过启发式算法,在老年代候选回收分区中,筛选出回收收益最高的分区添加到CSet中。
- Humongous:一种对象分配方式,用于处理超大对象,会直接分配在老年代,GC触发和寻常对象有所不同。
听不懂?听不懂没关系下一篇会详细介绍。