简要对比三种基本算法:
mark-sweep | mark-compact | copying | |
速度 | 中等 | 最慢 | 最快 |
空间开销 | 少(但会堆积碎片) | 少(不堆积碎片) | 通常需要活对象的2倍大小(不堆积碎片) |
移动对象? | 否 | 是 | 是 |
关于时间开销:
mark-sweep:mark阶段与活对象的数量成正比,sweep阶段与整堆大小成正比
mark-compact:mark阶段与活对象的数量成正比,compact阶段与活对象的大小成正比
copying:与活对象大小成正比
年轻代中的对象在minor GC时的存活率应该很低,这样用copying算法就是最合算的
年老代常用mark-sweep;或者是mark-sweep/mark-compact的混合方式,一般情况下用mark-sweep,统计估算碎片量达到一定程度时用mark-compact。这是因为传统上大家认为年老代的对象可能会长时间存活且存活率高,或者是比较大,这样拷贝起来不划算,还不如采用就地收集的方式。
UseSerialGC、UseParallelGC,虽然源码里这个full GC的实现类叫做MarkSweep,实际上是典型的mark-compact而不是mark-sweep