Oracle正在考虑将JEP248纳入Java9的JEP列表,这将在服务器配置中将G1作为默认垃圾收集器。这一决定在Java社区引发了一些争论,许多人同意并发标记和扫描(CMS)收集器可能更合适。如果实施此决定,G1将取代并行垃圾收集器作为服务器配置的默认选项。正如Oracle的内存管理白皮书中所述,并行垃圾收集器旨在通过不频繁(但可能会延长)的Stop-The-World(STW)中断来最大化应用程序吞吐量。并行垃圾收集器最大限度地减少了消耗的总计算时间,并且从长远来看中断较少,从而提供了更好的整体性能。该收集器非常适合响应时间不重要的应用程序,例如批处理。另一方面,GarbageFirst(G1)旨在以更高的计算成本为代价最小化STW中断时间,正如前G1性能负责人MonicaBeckwith先前在InfoQ上解释的那样。G1更适合低延迟的应用,比如web服务器,这也体现了StefanJohansson在JEP中描述的动机:一般来说,限制GC中断时间比最大化吞吐量更重要。对于大多数用户来说,切换到低中断垃圾收集器(例如G1)会比面向吞吐量的收集器(例如并行垃圾收集器)带来更好的整体体验。争议由此而来。HotSpot出于同样的目的引入了CMS,事实上,根据Oracle的描述,CMS“是为那些更喜欢减少垃圾收集中断时间的应用程序,以及那些在运行时可以与垃圾收集器共享处理器资源的应用程序而设计的”。许多公开的基准测试表明,CMS在内存占用相对较小的应用程序中往往优于G1,这与Oracle将G1描述为适用于堆大小为6GB及以上的服务器应用程序的描述是一致的。在最近的一次交流中,性能专家KirkPepperdine指出,Google对CMS做出了多项改进,但他们从未将其应用于HotSpot。他还补充说,虽然从长远来看G1可能是更好的选择,但Oracle的设计剥夺了社区获得更好的CMS体验的权利。查看英文原文:OracleProposesG1astheDefaultGarbageCollectorforJava9
