Java虚拟机--一段Java程序的生命史(七)

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

摘要:我们已经知道要回收的对象何时触发垃圾收集:安全点就是一些让程序暂定执行从而进行GC的位置,然后我们很容易知道GC停顿的时间是垃圾收集的核心。

 我们已经知道要回收的对象何时触发垃圾收集:安全点就是一些让程序暂定执行从而进行GC的位置,然后我们很容易知道GC停顿的时间是垃圾收集的核心。

1492674779275019.jpg

垃圾收集算法的所有以及衍生出来的垃圾收集器都是围绕着尽量减少GC停顿时间产生的,现在最新的G1垃圾收集器可以建立可预测的停顿时间模型有计划的避免在整个Java堆中进行全区域的垃圾收集。前面介绍内存区域分布的概念的时候我们谈到了新生代、老年代而不同的垃圾收集器有可能作用于新生代、也有可能作用于老年代甚至没有分代的概念(比如G1收集器)下面就具体介绍下垃圾收集算法及对应的垃圾收集器。
标记-清除算法
最基础的收集算法算法分为标记和清除两个阶段:首先标记处所有要回收的对象,在标记完成之后统一回收所有被标记的对象。它最大的不足是效率不高还会产生大量不连续的内存碎片导致的问题当程序运行过程分配较大对象时即使堆中还有足够的内但是无法找到足够的连续内存只能不得不触发一次GC操作这地方对应的垃圾收集器是CMS收集器。
复制算法
复制算法是为了解决效率问题而生的它可以将可用内存容量划分为大小相等的两块,每次只使用其中一块当这一块内存用完了就将还存活的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉这样每次会对整个半区进行GC并且不会产生内存碎片等问题。