第三章:垃圾回收算法

  • 标记-清除算法
算法分为标记、清除两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实就是之前介绍的两种算法(可达性分析算法)。
标记-清除算法的两个不足之处:一个是效率问题,标记和清除两个剁成的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致以后再程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作。
  • 复制算法
为了解决标记-清除的效率问题,一种称为“复制”的收集算法出现了,它将可用的内存划分为大小相同的两块,每次只使用其中一块,当这块的内存用完后,就将还存货的对象复制到另一块内存中,然后再把自己使用过的内存空间一次清空,这样使用的每次 都是对整个半区进行内存回收,内存分配时就不用考虑内存碎片的问题。 并且分配内存时可以使用指针碰撞的方式,通过移动指针按顺序分配对象的内存,实现简单、运行高效。
young region分为eden、from survior、to survior,每次使用eden和其中一块survior区,当回收内存时,将eden、survior中还存货的对象一次性复制到另一块survior空间上,最后清理eden、和刚才使用过的survior区。Hotspot虚拟机一般讲eden与survior按照8比1的比例划分。
IBM公司专门研究过表明:新生代的对象89%是“朝生夕死”的,
如果新生代回收时,另一块内存survior空间没有足够的空间存放下上一次新生代收集下来的存货对象时,这些对象将直接通过分配担保机制进入老年代。
  • 标记-压缩算法
复制收集算法在对象存货绿较高时就要进行较多的复制操作,效率将会表多。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所有在老年代一般不能直接使用这种复制算法。
标记-整理算法:标记处那些需要收集的对象,后续对内存空间进行移动,将所有存活的对象都向一端进行移动,然后直接清理掉边界以外的内存。
  • 分代收集算法
分代收集算法:只是根据对象存活周期的不同将内存划分为几块。一般把java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
在新生代一般采用复制算法。
在老年代一般采用标记-清除或者标记-整理算法。
收藏文章数量从多到少与“把书读薄”是一个道理
原文地址:https://www.cnblogs.com/use-D/p/10634251.html