标记清除
标记清除主要分为两步
- 标记,标记需要清除的对象
- 清除,在内存中清除这些对象
优点
- 速度快
- 清理之后存活对象的地址没变,所以不影响引用
缺点
- 会造成内存碎片
例如:清理了一个小对象,腾出一块小空间。当有大对象需要分配时因为空间太小就无法在此区域分配空间。 - 因为内存碎片导致内存不足及频繁gc
复制算法
- 把空间分成两份同等大小的区域
- 只有一块区域存放对象,当此区域快要满了的时候把存活的对象放到另一个区域里
- 清除之前的区域
优点
- 只搬运存活对象,速度也很快
- 不会产生内存碎片
缺点
- 降低了内存使用率,实际只使用了一半内存
标记整理
- 标记可回收对象
- 回收对象并腾出空间
- 对剩下存活的对象整理
和标记清除对比
- 前两步一样,多了对于存活对象的整理
优点
- 相对复制算法,节约空间
- 解决了标记清除的内存碎片问题
缺点
- 效率比上面两个低
实际使用
jvm
中年轻代采用的就是复制算法,因为年轻代中大部分对象是需要清空的,只用把少部分放到另一块内存即可
老年代采用的是标记-整理算法
网友评论