首先要说明,没有一款垃圾收集器是完美无缺的,只能分场景选择最适合的垃圾收集器。由于 G1 和 CMS 相比其他收集器都有停顿时间短的特点,所以主要对比这两个收集器: G1 优点: 停顿时间短; 用户可以指定最大停顿时间; 不会产生内存碎片: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等回收器。而且可以同时满足两代回收。
首先要说明,没有一款垃圾收集器是完美无缺的,只能分场景选择最适合的垃圾收集器。由于 G1 和 CMS 相比其他收集器都有停顿时间短的特点,所以主要对比这两个收集器:
G1 优点:
G1 需要记忆集 (具体来说是卡表)来记录新生代和老年代之间的引用关系,这种数据结构在 G1 中需要占用大量的内存,可能达到整个堆内存容量的 20% 甚至更多。而且 G1 中维护记忆集的成本较高,带来了更高的执行负载,影响效率。
按照《深入理解Java虚拟机》作者的说法,CMS 在小内存应用上的表现要优于 G1,而大内存应用上 G1 更有优势,大小内存的界限是6GB到8GB。