垃圾回收算法

现在主要的垃圾回收算法主要有四种垃圾算法

1.标记-清除算法

这个垃圾回收算法就是回收的时候只对标记出来已经没有用的对象进行回首之后回收之后并不执行任何操作,这个垃圾回收算法大家可以看出来有一个很大的问题就是会产生大量的内存碎片。垃圾回收算法

2.复制算法

复制算法的核心就是实现把内存分为两块区域,每次分配内存空间的时候只是从其中的一块分配,另一块还是空闲的,垃圾回收之后把还处于存活状态的对象直接复制到另一块空闲的区域内。这样就避免了内存碎片的产生。但是这样也有一个问题就是使用的内存空间不是全部的空间,第二就是必须保证GC之后空闲的区域有足够的空间给仍处于存活状态的对象使用。
垃圾回收算法

3.标记-整理算法

这个算法跟第一个标记-清除算法最主要的区别就是清楚之后还会对存活的对象进行一次整理,把存活的对象都整理到一起。这样也防止了内存碎片的出现。但是因为有整理的时间,所以他的效率没有标记-清除算法效率高。但是如果遇到比较大的对象需要分配内存空间的时候,它就会有充足的连续内存对大的对象分配内存。
垃圾回收算法

4.分代回收算法

这也是现在大部分垃圾回收器采取的算法。它把垃圾回收的区域分为新生代和年老代两个区域。这两个区域的大小都是可以在程序启动的时候使用参数来指定的。不同的垃圾回收器也会有它自己的默认值。年轻代主要采用的GC算法就是复制算法。
因为年轻代的对象好多都是朝生夕死,一次GC下来之后存活的对象就不多了。所以它对新生代的设计是两个survivor区和一个Eden区,每次新创建的对象都使用Eden区。发生一次新生代GC之后就把仍然存活的对象全部复制到另一个survivor区域。并且eden区清除。之后分配对象就是继续使用eden区,然后下次GC的时候就需要清除Eden区和上次那个存活对象的survivor区,并且把仍然存活的对象移到空闲的survivor区。这样以后每次GC都会清除eden区和其中的一个survivor区。
年老代使用的算法就是标记-清除法或者标记-整理法。因为年老代的对象生存周期比较长。