既然已经有了CMS,为什么还要开发G1?

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它非常适合于多核CPU、大内存的服务器环境。然而,CMS也有一些明显的缺点:

  1. CMS收集器对CPU资源非常敏感。在并发阶段,它需要与用户线程同时运行,如果CPU资源不足,会导致应用程序的吞吐量下降。
  2. CMS无法处理浮动垃圾。由于CMS并发清理时用户线程还在运行,因此在清理过程中还会产生新的垃圾,这部分垃圾CMS无法清理,只能等到下一次GC时清理。
  3. CMS收集器采用的是”标记-清除”算法,这样会导致大量的内存碎片。

G1(Garbage-First)收集器在很多地方上都对CMS进行了改进:

  1. G1收集器将Java堆内存分割为多个大小相等的独立区域(Region),而不是像CMS那样有年轻代、老年代的划分,这样可以更好地控制堆内存,避免出现大量内存碎片。
  2. G1收集器在后台维护了一个列表,记录了每个Region的垃圾对象的数量,垃圾对象最多的Region会被优先回收,这样可以尽可能降低内存占用,提高效率。
  3. G1收集器在设计时就考虑到了暂停时间,它可以让用户指定最大的垃圾收集停顿时间,然后系统会尽力保证按照用户的预期进行操作。

所以说,虽然有了CMS,但是为了解决CMS的缺点,以及更好地适应现代多核处理器、大内存的环境,G1收集器还是应运而生。

发表评论

后才能评论