垃圾回收浅谈

GC机制

在对象回收中对象会被划分成三个部分,年轻代、年老代和持久代三个部分。
当我们new 对象的时候首先会存放在年轻代中,其中年轻代有Eden区和survivor区,new对象首先会先存放在年轻代的Eden区 当Eden存放满的时候引发GC,此时会把存活的对象放入到survivor区,survivor有两块区域,即当一块区域存放满引发一次GC后会把存活的对象放入到另外一块survivor中,如果这块survivor也存满引发的GC会将存活的对象放入到年老代中。持久代中存放的是一些静态的文件,比如类文件和方法。

回收算法

大致的回收算法有引用计数、标记-清除、复制、标记-整理和分代算法。

  • 引用计数
    该对象被引用到一次,计数便加上一次,删除一次引用计数就减一,回收那些计数为零的对象即可,但是无法解决循环引用的问题。
  • 标记-清除
    从根引用出发标记出被引用的对象,第二次清除未被标记的对象,但是需要暂停整个应用,并产生大量的碎片。
  • 复制
    将内存空间分成两块区域,只使用其中的一块区域,每次GC时遍历这块区域,将其中正在使用的对象复制到另外一块区域,并清除区域中不被使用的对象,能清理碎片空间但是需要两倍的内存空间。
  • 标记-整理
    将标记清除和复制算法相结合,先从根节点出发标记被引用的对象,第二次遍历,把标记的和正在使用的对象压缩到一块区域并按照顺序存放。这样避免碎片化的同时还节约了空间的使用。
  • 分代
    对于年轻代、年老代和持久代采用不同的算法来GC。对于存活率低的年轻代采用复制算法,对于存活率高的年老代采用标记清除或者标记整理来处理。

你可能感兴趣的:(垃圾回收浅谈)