java 垃圾回收算法

 

垃圾收集算法

在许多现代语言中(java,C#,python)等,垃圾回收机制是一个最主要的特性。自动内存回收,使得程序员可以把注意力从内存分配挪开,更加专注于程序的逻辑。

本文在此简单地介绍几种垃圾回收算法的思想。

1.标记-清除(Mark-Sweep)算法

正如算法的名称,此方法分为两个阶段。第一个阶段,标记处所有需要回收的对象。第二个阶段,回收所有被标记的对象。

优点:最基础的收集算法,其他算法都基于这种思路。

缺点:标记和清除的效率不高;内存碎片。

2.复制(Copying)算法

将可用内存按容量划分为大小相等的两块。每次只使用其中的一块。当一块内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

缺点:可用内存缩小为原来的一半。

改进:不需要按照1:1的比例来划分空间。将内存划分为较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块 Survivor。当回首时,将Eden和Survivor中还存活着的对象一次性地拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用 过的Survivor的空间。Eden和Servivor的大小比例一般是8:1。

3.标记-整理(Mark-Compact)算法

复制算法在对象存活率较高时要执行较多的复制操作,效率会变低。标记-整理算法对标记-清楚算法进行了改进,标记过程与标记-清楚算法一致,但后续不是直接对可回收对象进行清理,而是让所有存活的对象都想一端移动,然后直接清理掉端边界以外的内存。

4.分代收集算法

根据对象的存活周期的不同将内存划分为几块,综合使用不同的收集算法。例如,Java堆一般分为新生代和老生代,这样子可以根据不同的内存特点,采用最适 合的收集算法。例如,在新生代中,每次垃圾收集都有大批对象死去,只有少量存活,因此使用复制算法。老生代对象存活率高,因此使用标记-清除算法或标记- 整理算法。

你可能感兴趣的:(java)