本文只讨论垃圾收集的算法的思想
垃圾收集器 是按照标记存活对象实现的,而标记死亡对象 应该需要扫描所有对象,标记存活对象只需要从gcroot出发即可吧
1.标记-清除 标记死亡对象有点问题 需要扫描所有对象
- 标记阶段:标记处所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。我们是通过对象搜索其与GC Roots是否有引用链,如果没有则暂定为不可达(后续会根据其是否覆盖了finalize方法来判断是否需要二次标记)
- 清除:把标记的对象进行回收
缺点:标记和清除的效率都慢,其次会造成堆内存空间碎片化,从而导致无法分配大对象,进而引起gc。
2.复制算法(回收新生代)
- 为了解决效率和碎片问题,将内存划分为等分的两块,每次只使用一块,当一块用完了,就将还存活着的对象复制到另一块上面,然后把已使用的内存清理掉。
缺点:内存使用率低下,所以目前的算法都是把新生代分为1:1:8。如果在老年代, 复制算法在整体对象存活率较高的情况下就要执行较多的复制操作,从而导致效率变低。
标记-整理算法(回收老年代)
-类似于标记-清除,在回收对象的时候,是让所有存活的对象都移向一端,然后直接清理掉端边界以外的内存。即所谓的压缩
分代收集法
- 根据内存对象存活周期把对象分为新生代和老年代,其中复制算法清理新生代,标记-整理清理老年代
网友评论