VM中常见的几种垃圾回收算法,以便您更好地理解垃圾回收的概念。常见的垃圾回收算法包括:
标记-清除(Mark-Sweep)算法
:
标记(Mark)阶段:从根对象(通常是静态变量和正在执行的方法中的局部变量)开始,递归地访问所有可达的对象,并标记它们为“存活”。
清除(Sweep)阶段:遍历整个堆内存,回收未被标记的对象所占用的空间。
复制(Copying)算法
:
1 将可用内存划分为两个等大小的区域。在任意时间点,只有其中一个区域被使用,另一个区域是空闲的。
2 当前使用的区域内存耗尽时,存活的对象会被复制到另一个空闲区域,然后整个当前区域会被清理掉。
这种算法简单且高效,但代价是内存的使用率降低了(因为只有一半的内存是可用的)。
标记-整理(Mark-Compact)算法
:
标记阶段与标记-清除算法相同。
整理(Compact)阶段:移动所有存活的对象,使它们紧挨着彼此,然后直接清理掉边界以外的内存。
这种算法可以提高内存的使用效率,但移动对象会引入额外的开销。
分代收集(Generational Collection)算法:
基于一个观察结果:大多数对象的生命周期都很短。因此,JVM将堆内存划分为几个不同的区域(通常是新生代和老年代),并针对不同区域应用不同的垃圾回收策略。
新生代通常使用复制算法,因为大多数对象都在这里快速创建和销毁。
老年代则可能使用标记-清除或标记-整理算法,因为这里的对象存活时间较长。
在整理阶段有:
整理(压缩)算法分类:
随机整理(双指针算法):
线性整理:
LIsp2整理算法(三指针算法)
单次遍历算法
整理的好处可以将不同页中的数据,整理到一起,这样当内存访问的时候加载一页数据,说不定需要的数据都在这一页中,减少了页加载。
分代收集(Generational Collection)算法
:
基于一个观察结果:大多数对象的生命周期都很短。因此,JVM将堆内存划分为几个不同的区域(通常是新生代和老年代),并针对不同区域应用不同的垃圾回收策略。
新生代通常使用复制算法,因为大多数对象都在这里快速创建和销毁。
老年代则可能使用标记-清除或标记-整理算法,因为这里的对象存活时间较长。