不同收集器可能采用的算法不一样,我们这里是对serial 以及ParNew 垃圾收集器进行说明。
为什么新生代采用标记复制算法?
首先明确一点,新创建的对象一般都会先分配在新生代,进行垃圾回收时,会有很多垃圾需要清除。
采用标记复制,我们只需要将不是垃圾的对象标记出来,给他复制到另一块去,然后把现在这一块直接干掉。
比如说我是一个捡垃圾的老太太,我现在找到了一个垃圾箱,我就在里面翻一翻,把有用的瓶子拿走了,其他都不要。这就是标记复制的思想。
为什么老年代不采用标记复制,而是标记整理嘞?
首先我们再来明确一点,在老年代的对象要么存活时间比较久,也就是说有用的对象比较多,要么对象比较大,新生代直接放不下。
这个时候如果我们采用标记复制算法,需要复制的代价就比较高(因为需要留下来的对象比较多,而且可能会很大),不划算,当然其实标记整理算法需要的代价也不低,那为什么还要采用呢?因为复制算法有一个缺点,就是每次只能用一半的空间,会比较浪费,既然复制和整理代价都高,复制算法还只能用一半,那肯定就选择标记整理了啦。
不过现在新一些的垃圾收集器已经不采用了,像CMS和G1他们就已经不一样了。