jvm G1垃圾收集器有什么缺点?

G1垃圾收集器是否适用于所有情况?相对于cms、parallel等有什么优缺点?

阅读 11.6k
2 个回答

首先要说明,没有一款垃圾收集器是完美无缺的,只能分场景选择最适合的垃圾收集器。由于 G1 和 CMS 相比其他收集器都有停顿时间短的特点,所以主要对比这两个收集器:

  • G1 优点:

    1. 停顿时间短;
    2. 用户可以指定最大停顿时间;
    3. 不会产生内存碎片:G1 的内存布局并不是固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域 (Region),G1 从整体来看是基于“标记-整理”算法实现的收集器,但从局部 (两个Region 之间)上看又是基于“标记-复制”算法实现,不会像 CMS (“标记-清除”算法) 那样产生内存碎片。
  • G1 缺点:

    G1 需要记忆集 (具体来说是卡表)来记录新生代和老年代之间的引用关系,这种数据结构在 G1 中需要占用大量的内存,可能达到整个堆内存容量的 20% 甚至更多。而且 G1 中维护记忆集的成本较高,带来了更高的执行负载,影响效率。

按照《深入理解Java虚拟机》作者的说法,CMS 在小内存应用上的表现要优于 G1,而大内存应用上 G1 更有优势,大小内存的界限是6GB到8GB。

新手上路,请多包涵
  • G1特点:在满足短时间停顿的同时,达到一个高的吞吐量,适用于多核处理器,大内存的系统。
  • 短停顿时间且可控:

    • G1对内存进行分区,基于部分内存回收的新生代收集和混合收集。
  • 高吞吐量:

    • 优化GC工作,使其尽可能与Mutator并发工作;
    • 设计了新的并发标记线程,用于并发标记内存;
    • 设计了Refine线程并发处理分区之间的引用关系

以我浅薄的理解,G1已经基本能全面替代cms、parallel等回收器。而且可以同时满足两代回收。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏