为什么Java CMS GC 使用单线程做 Full GC?
虽然今天 CMS GC 已经不被推荐, 可是还经常被用来和G1 GC 做对比. 其中导致CMS 不被推荐的重要原因是: CMS 的full GC 是单线程的, 在如今多核统治天下的情况下, 单线程的 full GC 肯定比多线程的 full GC 慢很多.
CMS 什么情况下会产生full GC
- 并发模式失败(concurrent mode failures) 老年代并发回收的速度跟不上年轻代晋升的速度;
- 碎片化, 老年代虽然有足够的空间, 可是都是碎片化的, 没有一个连续的可容纳的空间;
- 元数据区(metaspace)/老年代没有空间;
- 明确的 System.gc() 或 Runtime.gc() 调用
为什么不把 parallel old 的算法引入CMS, 使之可以多线程
二者的数据结构不一样, 如果引入需要大量修改
为什么不重新为了 CMS 写一个多线程的 full gc?
据说开发工程师把更多的时间都用去写 G1 了, 并且 G1 各方面的期望都比CMS 好, 没有必要再写要给给CMS.
其它
google 内部有一个CMS 的老年代GC 实现, 并且曾经尝试patch到openJDK, 不过最后没有做到:
http://openjdk.java.net/jeps/8130200
最好还是用G1