天天看点

JVM基础到实战04-垃圾回收算法

上一章讲了对象的存活分析,分析完对象是否存活后,我们就需要执行相应的垃圾回收过程,至于选择哪种垃圾回收算法呢,目前主要有以下三种垃圾回收算法:

1.标记清除算法

JVM基础到实战04-垃圾回收算法

过程:标记--》清除

产生的问题:

1.标记和清除的过程效率都不高

2.空间问题,标记清除后会产生大量的不连续内存碎片,空间碎片越多会导致以后程序在

在分配较大的对象实,无法找到足够的连续内存二不得不提前出发一次垃圾收集动作。

2. 复制算法

JVM基础到实战04-垃圾回收算法

过程:分为AB两块内存,将A中存活对象内存复制到B中,然后将A中的全部置为空

为什么出现?

现在的商业虚拟机都采用这种算法来回收新生代,主要是新生代中98%的对象都是朝生夕死的,

所以有大量的内存是需要回收的,我们只需要移动少部分内存。所以并不需要按1:1来分配

而是将内存分为较大的一块Eden和两块较小的Survivor空间,每次实用一块Eden和其中一块survivor,

survivor from 和survivor to。比例是8:1:1,

如果腾出的内存不够,会用担保分配算法(将对象分配至老年代)

缺点:复制算法在对象存活率较高时,需要复制较多的内存,更关键的是,如果不想浪费50%的

内存,就需要额外的空间进行分配担保,以因对被使用的内存中所有对象都是100%存活

的极端情况,所以,老年代不能使用复制算法

3.标记整理算法

JVM基础到实战04-垃圾回收算法

过程:将所有存活的对象标记处来,全部整理到一端,剩下的部分内存全部置空