这种算法的代价是将内存缩小为了原来的一半,代价很大。这种算法也在特殊场景中会有很大用处,比如回收新生代的时候,IBM 公司的专门研究表明,新生代的对象 98% 是"朝生夕灭"的,所以不需要按照 1:1 的比例来划分内存区域,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 空间和其中一块 Survivor 空间。当回收时,将 Eden 空间和 Survivor 空间中还存活着的对象一次性地复制到另外一块 Survivor 空间上,最后清理掉 Eden 和刚才使用过的 Survivor 空间。这里肯定有一个具体空间分配比例,HotSpot 虚拟机默认 Eden:Survivor 为 8:1,也就是每次新生代中可用内存为整个新生代的 90%(80%+10%),只有 10% 的内存会被"浪费"。当然,98% 的对象可回收只是一般场景下的数据,JVM 没有办法保证每次回收都只有不多于 10% 的对象存活,当 Survivor 空间不够用时,需要依赖其它内存(这里指老年代)进行分配担保(Handle Promotion)。