Java虚拟机:GC算法深度解析(三)

  • 来源:
  • 更新日期:2018-05-23

摘要:标记/整理算法:复制算法在对象存活率较高时要进行较多的复制操作效率会变得很低,更关键的是如果不想浪费50%的内存空间,就需要有额外的内存空间进行分配担保以应对内存中对象100%存活的极端情况,因此在老年代中由于对象的存活率非常高,复制算法就不合适了。

 标记/整理算法:复制算法在对象存活率较高时要进行较多的复制操作效率会变得很低,更关键的是如果不想浪费50%的内存空间,就需要有额外的内存空间进行分配担保以应对内存中对象100%存活的极端情况,因此在老年代中由于对象的存活率非常高,复制算法就不合适了。

根据老年代的特点高人们提出了另一种算法:标记/整理算法。从名字上看这种算法与标记/清除算法很像,事实上标记/整理算法的标记过程任然与标记/清除算法一样,在后续步骤不是直接对可回收对象进行回收而是让所有存活的对象都向一端移动然后直接清理掉端边线以外的内存。
回收后可回收对象被清理掉,存活的对象按规则排列存放在内存中这样一来当我们给新对象分配内存时虚拟机只需要持有内存的起始地址即可。
20150619_8403fcf6dfb222b5192aXUt8c7bgg9Ko.jpg
标记/整理算法不仅弥补了标记/清除算法存在内存碎片的问题也消除了复制算法内存减半的高额代价可谓一举两得。但任何算法都有缺点,就像人无完人标记/整理算法的缺点就是效率也不高,不仅要标记存活对象还要整理所有存活对象的引用地址在效率上不如复制算法。
把以上三种算法的原理弄清楚我们下面来从几个方面对这几种算法做一个简单排行。
效率:复制算法 > 标记/整理算法 > 标记/清除算法(标记/清除算法有内存碎片问题,给大对象分配内存时可能会触发新一轮垃圾回收)
内存整齐率:复制算法 = 标记/整理算法 > 标记/清除算法
内存利用率:标记/整理算法 = 标记/清除算法 > 复制算法