JAVA垃圾回收算法

用于学习记录

一丶标记-清除算法

步骤: 

    1、标记:从根集合开始扫描,标记存活对象; 

    2、清除:再次扫描真个内存空间,回收未被标记的对象。 

此算法一般没有虚拟机采用 

优点1:解决了循环引用的问题 

优点2:与复制算法相比,不需要对象移动,效率较高,而且还不需要额外的空间 

不足1:每个活跃的对象都要进行扫描,而且要扫描两次,效率较低,收集暂停的时间比较长。 

不足2:产生不连续的内存碎片

二丶标记-整理(压缩)算法

对标记-清除算法的改进 

标记过程与标记-清除算法一样,但是标记完成后,存活对象向一端移动,然后清理边界的内存 

步骤: 

1、标记:从根集合开始扫描,标记存活对象; 

2、整理:再次扫描真个内存空间,并往内存一段移动存活对象,再清理掉边界的对象。 

不会产生内存碎片,但是依旧移动对象的成本。 

适合老年代 

还有一种算法是标记-清除-整理(压缩),是在多次标记清除后,再进行一次整理,这样就减少了移动对象的成本。

三丶复制算法

将内存分成两块容量大小相等的区域,每次只使用其中一块,当这一块内存用完了,就将所有存活对象复制到另一块内存空间,然后清除前一块内存空间。 

此种方法实现简单、效率较高,优点: 

1、不会产生内存碎; 

2、没有了先标记再删除的步骤,而是通过Tracing从 From内存中找到存活对象,复制到另一块To内存区域,From只要移动堆顶指针便可再次使用。 

缺点: 

1、复制的代价较高,所有适合新生代,因为新生代的对象存活率较低,需要复制的对象较少; 

2、需要双倍的内存空间,而且总是有一块内存空闲,浪费空间。

四丶分代收集算法

所有商业虚拟机都采用这种方式,将堆分成新生代和老年代,新生代使用复制算法,老年代使用标记-整理算法

你可能感兴趣的:(JAVA垃圾回收算法)