跟叶子猿学习JVM(六)垃圾回收机制(三)——垃圾回收算法(标记-清除,复制,标记-整理,分代收集)

                       Java 垃圾回收机制常用的垃圾回收算法


1.标记-清除算法(用于堆内存中新生代的垃圾回收算法)


将可达性分析算法所标记的可回收对象进行回收,这个算法在空间和效率都存在问题,因为经过垃圾回收后,内存中会出现很多空闲的但是不连续的空间,当我们要分配一个大对象的时候,可能会出连续的空间不足的情况,导致空间不足。那么这时虚拟机还会执行一次垃圾回收,导致效率降低。所以此算法不常用。


2.复制算法(用于堆内存中新生代的垃圾回收算法)


我们知道Java内存分为五大块,堆区,方法区,虚拟机栈,本地方法栈,程序计数器。堆区是垃圾回收器的主要工作场所,为了提升垃圾回收效率,堆区又进行了进一步的划分为新生代和老年代。同样为继续提升垃圾回收效率,新生代又划分为Eden区,Survivor区。如图:

每当有新对象需要分配,都会在Eden区划分出一块内存供对象使用,垃圾回收执行的时候,会将Eden区和SurvivorA区的继续存活对象复制到SurvivorB区中,并将Eden区和SurvivorA区清空。下次垃圾回收执行的时候,会将Eden区和SurvivorB区的继续存活对象复制到SurvivorA区中,并将Eden区和SurvivorB区清空。对象经历一次复制,年龄就会+1,当年龄为15的时候(这个15是由MaxTenuringThreshold指定,默认值15),这个对象就可以进入老年代,那么老年代如何进行垃圾回收呢?就要用到我们接下来要说的标记整理算法


3.标记-整理算法(用于堆内存中老年代的垃圾回收算法)


与标记-清除算法相似,只是在标记与清除之间增加了整理的步骤,我们可以想象为老年代中划分了两块(A、B),假定A中存放不可回收对象,B中存放可回收对象,当A中产生了可回收对象,这个对象就会被整理到B区中,当然B中的可回收对象如果标记为了不可回收对象,那么这个对象也会被整理到A区中,由此一来,A中存放的全部是不可回收对象,B中存放全部是可回收对象。那么垃圾回收的时候,只需要将B区清空即可。


4.分代收集算法


结合了复制算法和标记-整理算法。根据内存的分代,选择不同的算法。

猜你喜欢

转载自blog.csdn.net/Peacock__/article/details/88873191