G1 垃圾收集器了解吗?

对Garbage First(简称G1)收集器的描述进行改写如下:

G1收集器是垃圾收集器领域的一项创新性成果,它引入了局部收集的设计思想和基于Region的内存布局形式。

尽管G1仍然符合分代收集的理论设计,但是它的堆内存布局与其他收集器有着显著的差异。传统的收集器将Java堆划分为新生代、老年代和永久代等连续区域。

而G1将连续的Java堆划分为多个大小相等的独立区域(Region),每个Region根据需要可以充当新生代的Eden空间、Survivor空间或者老年代空间。收集器可以针对不同角色的Region采用不同的策略进行处理。

jvm-35.png

这样就避免了对整个堆进行收集,而是按照若干个Region集进行收集。同时,G1维护着一个优先级列表,用于跟踪各个Region回收的"价值",优先收集价值较高的Region。

G1收集器的运行过程大致可划分为以下四个步骤:

  • 初始标记(initial mark):对从GC Root开始直接关联可达的对象进行标记。这个过程需要进行STW(Stop the World)操作。
  • 并发标记(concurrent marking):与用户线程并发执行,从GC Root开始对堆中的对象进行可达性分析。递归扫描整个堆中的对象图,找出要回收的对象。
  • 最终标记(remark):STW操作,对并发标记过程中产生的垃圾进行标记。
  • 筛选回收(live data counting and evacuation):制定回收计划,选择多个Region构成回收集,将回收集中存活的对象复制到空的Region中,然后清理整个旧Region的全部空间。这个过程需要进行STW操作。

标签: java, Java面试题, Java问题合集, ava常见问题, Java编程, Java问题精选