前言
jvm 中当前使用的垃圾回收算法(注意不是垃圾收集器)有三种,分别是标记-清除算法、标记-压缩算法,复制算法
标记-清除算法
原理:从 gc root 出发,标记处不是垃圾的存活对象,然后把剩下的没被标记到的垃圾对象清除
问题:垃圾回收后,空闲内存区域不连续,每次给新对象分配内存都需要遍历不连续的空闲区域,而且如果新对象大于每个空闲区域,即使空闲区域总和足够大,也无法分配新对象使用。
标记-压缩算法
原理:从 gc root 出发,标记出不是垃圾的存活对象,然后清除掉没被标记的垃圾对象。最后,把存活对象全部整理到堆内存的最前边,让剩下的空闲区域连续。
问题:每次都需要移动存活对象,开销较大。
复制算法
原理:将内存划分划分成两部分(记为 A 和 B),每次使用其中一部分,例如先使用 A,当 A 剩余空间不足时,出发垃圾回收,将 A 中的存活对象放到 B 中,然后直接回收 A 的全部空间。
问题:内存空间始终有一部分未被使用,浪费明显
网友评论