用于学习记录
一丶标记-清除算法
步骤:
1、标记:从根集合开始扫描,标记存活对象;
2、清除:再次扫描真个内存空间,回收未被标记的对象。
此算法一般没有虚拟机采用
优点1:解决了循环引用的问题
优点2:与复制算法相比,不需要对象移动,效率较高,而且还不需要额外的空间
不足1:每个活跃的对象都要进行扫描,而且要扫描两次,效率较低,收集暂停的时间比较长。
不足2:产生不连续的内存碎片
二丶标记-整理(压缩)算法
对标记-清除算法的改进
标记过程与标记-清除算法一样,但是标记完成后,存活对象向一端移动,然后清理边界的内存
步骤:
1、标记:从根集合开始扫描,标记存活对象;
2、整理:再次扫描真个内存空间,并往内存一段移动存活对象,再清理掉边界的对象。
不会产生内存碎片,但是依旧移动对象的成本。
适合老年代
还有一种算法是标记-清除-整理(压缩),是在多次标记清除后,再进行一次整理,这样就减少了移动对象的成本。
三丶复制算法
将内存分成两块容量大小相等的区域,每次只使用其中一块,当这一块内存用完了,就将所有存活对象复制到另一块内存空间,然后清除前一块内存空间。
此种方法实现简单、效率较高,优点:
1、不会产生内存碎;
2、没有了先标记再删除的步骤,而是通过Tracing从 From内存中找到存活对象,复制到另一块To内存区域,From只要移动堆顶指针便可再次使用。
缺点:
1、复制的代价较高,所有适合新生代,因为新生代的对象存活率较低,需要复制的对象较少;
2、需要双倍的内存空间,而且总是有一块内存空闲,浪费空间。
四丶分代收集算法
所有商业虚拟机都采用这种方式,将堆分成新生代和老年代,新生代使用复制算法,老年代使用标记-整理算法