JVM性能调优-你不得不懂的G1收集器

  • 2019 年 12 月 20 日
  • 笔记

简介:G1垃圾收集器
是什么

G1是⼀款⾯向服务端应⽤的垃圾收集器

特点

G1 中每个 Region 都有⼀个与之对应的 Remembered Set,当进⾏内存回收时,在 GC 根节点的枚举范围中加⼊ Remembered Set 即可保证不对全堆扫描也不会有遗漏 检查Reference引⽤的对象是否处于不同的Region

G1 收集器的运作⼤致可划分为以下⼏个步骤
  • 初始标记(Initial Marking) –标记⼀下 GC Roots 能直接关联到的对象
  • 并发标记(Concurrent Marking)—从GC Root 开始对堆中对象进⾏可达性分析,找出存活的对象,这阶段耗时较⻓,但可与⽤户程序并发执⾏
  • 最终标记(Final Marking) —为了修正在并发标记期间因⽤户程序继续运作⽽导致标记产⽣变动的那⼀部分标记记录。虚拟机将这段时间对象变化记录在线程 Remembered Set Logs⾥⾯,最终标记阶段需要把 Remembered Set Logs的数据合并到 Remembered Set 中
  • 筛选回收(Live Data Counting and Evacuation)
G1的优势有哪些
  • 空间整合:基于“标记⼀整理”算法实现为主和Region之间采⽤复制算法实现的垃圾收集
  • 可预测的停顿:这是 G1 相对于 CMS 的另⼀⼤优势,降低停顿时间是 G1 和 CMS 共同的关注点,但 G1 除了追求低停顿外,还能建⽴可预测的停顿时间模型
  • 在 G1 之前的其他收集器进⾏收集的范围都是整个新⽣代或者⽼年代,⽽ G1 不再是这样。使⽤ G1 收集器时,Java 堆的内存布局就与其他收集器有很⼤差别,它将整个 Java 雄划分为多个⼤⼩相等的独⽴区域(Region),虽然还保留有新⽣代和⽼年代的概念,但新⽣代和⽼年代不再是物理隔髙的了,它们都是⼀部分 Region(不需要连续)的集合。
  • G1 收集器之所以能建⽴可预测的停顿时间模型,是因为它可以有计划地避免在整个 Java 堆中进⾏全区域的垃圾收集。G1 跟踪各个 Regions ⾥⾯的垃圾堆积的价值⼤⼩(回收所获得的空间⼤⼩以及回收所需时间的经验值),在后台维护⼀个优先列表,每次根据允许的收集时间,优先回收价值最⼤的 Region(这也就是 Garbage- Firsti 名称的来由)。这种使⽤Region 划分内存空间以及有优先级的区域回收⽅式,保证了 G1 收集器在有限的时间内可以获取尽可能⾼