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