关于jvm:总结G1垃圾收集器面试题

33次阅读

共计 1262 个字符,预计需要花费 4 分钟才能阅读完成。

介绍一下 G1 垃圾收集器

G1 收集器随同 JAVA9 于 2017-9-21 公布,G1 收集器兼顾 低提早 高吞吐 在服务端运行,HotSpot 团队冀望取代 CMS 收集器。也就是在满足进展工夫的状况下获取最大的吞度量。有两种收集模式 Young GC 和 Mixed GC。G1 收集器将堆内存划分成大小相等的 Region, 新生代, 老年代也就成了逻辑概念。整体上采纳的是 标记 - 整顿 算法, 部分采纳了 复制算法

G1 是 jdk1.9 的默认垃圾收集器,-XX:+UseG1GC 开启

G1 收集器 Region 的类型

  • 新生代
  • 老年代
  • 未应用
  • 大对象区

新生代 , 老年代 Region不再是一块间断的空间。当然寄存大对象的 Region 必须要间断。

G1 收集器中 大对象 怎么调配

  • 对象的大小 <0.5 个 RegionSize 间接存在新生代 Eden Region
  • 对象的大小 >=0.5 个 RegionSize 且对象的大小 <1 个 RegionSize, 存到大对象区Humongous Region
  • 对象的大小 >= 1 个 RegionSize 存到间断的大对象区Humongous Region

怎么指定 Region 的大小

应用 -XX:G1HeapRegionSize 来指定 Region 的大小,Region 的大小必须是 2 的幂次方, 最大 32M。

G1 垃圾收集器的运行过程?

初始标记(stop the world)

比拟 GC Roots 间接援用的对象同时标记, 同时标记 GC Roots 对象所在的 Region 称为Root Region

根分区扫描

扫描整个老年代 RegionRset, 标记蕴含 初始标记 阶段的 Root RegionRegion

并发标记

遍历 根分区扫描 步骤标记好Region, 标记所有可达对象, 和利用线程并发执行

从新标记(stop the world)

因为 并发标记 是和利用线程并发执行的, 所以不可避免的有些对象会发生变化,G1 GC 清空 SATB 缓冲区,跟踪未被拜访的存活对象,并执行援用解决。

抉择革除(stop the world)

评估每个 Region 的垃圾量, 选取回收成果最好的若干 Region 收集(取决于 -XX:MaxGCPauseMillis 设置值, 默认是 200ms)。在规定进展工夫内, 获取最大的吞吐量。

什么是Rset

每个 Region 初始化时, 都会初始化一个 Rset(remembered set), 每个 Region 都蕴含一个 Rset,Rset 的作用是记录了哪些内存区域 (Region) 堆以后 Region 的援用。Rset是一个空间换工夫的数据结构。有了 Rset 能够防止对整个堆进行扫描。

G1 和 CMS 的区别

  • G1 采纳 标记 - 整顿 算法,CMS 采纳 标记 - 革除 算法, 所以 G1 不会产生很多垃圾碎片.
  • G1 的 STW(stop the world)可控, 能够应用 -XX:MaxGCPauseMillis 设置默认 200ms
  • G1 的 Young GC 模式能够工作在 年老代 , 而独自的CMS 只能工作在 老年代.

G1 的利用场景

  • 服务端多核 CPU,JVM 占用较大的利用(至多大于 4G)。
  • 利用在运行过程中产生大量的碎片, 须要常常压缩。
  • 想要更可控, 可预期的进展工夫; 避免高并发下利用雪崩景象。

正文完
 0