1,标记 - 清除算法
标记清除算法也是最基础的算法,就如同他的名字一样,标记清除算法的步骤分为两个步骤,首先标记出需要回收的所有对象,然后在完成标记之后统一清除掉所有被标记的对象,之所以说它是最基础的算法,是因为后续算法都是基于此算法,改进其缺点衍生出来的,标记清除算法有两个缺点,标记和清除这两个步骤都会有性能损耗,且效率低,其次是在完成对象的清除后会留下不连续的内存碎片,算法如下图:
2,复制算法
为了提高效率,我们又引入了复制算法,将现有可用的内存大小均分为二,每次只使用其中一半,当这半内存已满,就将未消亡的对象 copy 到另一半去,然后再把使用过的内存清除掉,往复如此,每次分配内存我们只需要按照顺分配,就不需要考虑产生内存碎片,高效运行,但也有一个缺点,就是每次可以使用的内存减半,算法如下图:
3,标记 - 整理算法
我们发现,在对象存活率较高的时候(老年代的特点),每次复制都包含了对大量存活对象的 copy,这个时候就会大大降低复制算法的效率,除此之外,我们也不想可用内存减半,这时候我们就需要引入标记整理算法,标记整理算法也分为两个步骤,第一步标记和标记清理算法一致,标记需要回收的对象,不过第二步不是直接回收,而是将村会的对象向可用内存空间某一端移动,而清除掉端边界以外的内存.算法如图:
4,分代收集算法
目前商用虚拟机所使用的收集算法,将内存分为多个模块,把新生的对象存储在新生代(也叫年轻代),将新生代多次 gc 依旧存活的对象移动到老年代中.
新生代:存储新创建的对象,gc 时往往伴随着大量的需要回收的对象,所以新生代采用复制算法,只需将少量存活对象 copy,就可以完成对象回收.
老年代:当新生代创建的对象经历多次 gc 依旧存活之后,就会将他移动到老年代,所以在对老年代的对象进行回收时,往往伴随着大量存活的对象,这时候就可以选择 标记清除算法,标记整理算法.
持久代:存放静态文件,java 类,方法等,对垃圾回收并无太大影响
来源: http://www.bubuko.com/infodetail-2477183.html