技巧💡

分区,无分代概念

Garbage First,官方目标: 就是在延迟可控的情况下,获得尽可能高的吞吐量,所以才担当起全功能收集器的重任和期望.

  • 使用标记复制法标记整理法
  • G1是一个并行回收器,他把堆内存分割为很多不相关的区域(Region)(物理上不连续) 使用不同的region表示Eden,s0,s1,老年代等
  • G1跟踪各个region里面垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region
  • JDK1.7版本正式启用,jdk9以后默认垃圾回收器
    优点:
  1. 停顿时间短;
  2. 用户可以指定最大停顿时间;
  3. 不会产生内存碎片:G1 的内存布局并不是固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域 (Region),G1 从整体来看是基于“标记-整理”算法实现的收集器,但从局部 (两个Region 之间)上看又是基于“标记-复制”算法实现,不会像 CMS (“标记-清除”算法) 那样产生内存碎片。
    缺点:
    G1 需要记忆集 (具体来说是Rset)来记录新生代和老年代之间的引用关系,这种数据结构在 G1 中需要占用大量的内存,可能达到整个堆内存容量的 20% 甚至更多。而且 G1 中维护记忆集的成本较高,带来了更高的执行负载,影响效率

适用场景

适用场景面向服务器端应用,针对具有大内存,多处理器的机器。CMS 在小内存应用上的表现要优于 G1,而大内存应用上 G1 更有优势,大小内存的界限是6GB到8GB.