G1 相对于 CMS 有哪些进步的地方?
G1 相对于 CMS 有哪些进步的地方?
回答重点
可以从以下四个方面来回答:
从内存管理机制来看:
- G1 将整个堆划分为多个大小相等的Region(默认最多2048个),物理上不再严格区分新生代和老年代,而是根据回收价值动态调整各区域的回收。这样避免了CMS因固定分代导致的内存碎片问题,提升了内存利用率。
从回收算法来看:
- CMS 采用标记-清除算法,容易产生内存碎片,可能导致Full GC提前触发
- 而 G1 基于标记-整理算法,回收时通过Region间的对象复制实现空间整合,几乎不产生碎片。
从停顿时间控制来看:
- G1允许用户通过参数(如
-XX:MaxGCPauseMillis)设定预期的最大停顿时间,并动态选择回收价值高的Region优先处理,从而避免CMS在极端场景下的不可控停顿(如内存碎片引发的长时间Full GC)。
从大对象优化来看:
- CMS 中超过 Survivor 区大小的对象会直接进入老年代,加剧碎片问题;
- 而 G1 通过跨 Region 存储(对象超过单个Region 50%时分散存放),避免大对象对分代模型的破坏。
除此之外 CMS 仅负责老年代,需配合 ParNew 等新生代收集器,而 G1 可独立管理整个堆,减少协调开销,更适合大内存和多核环境。
扩展知识
Comments