垃圾收集算法
- 使用某种既定规则,完成对JVM无用对象空间的清理
- 各种回收算法实现的思路不一样,所需的时间消耗与空间占用也不同
- 无论哪种回收算法都希望提高应用程序性能的同时,尽量保证时间与空间的平衡
方式
- 标记-清除算法
- 首先标记出所有的垃圾对象
- 标记完成之后统一回收被标记对象
- 复制算法
- 将内存划分成两个相同的空间,内次只使用其中的一半
- 将存货对象复制到另外一块保留区域后,一次性清除原有空间
- 标记-压缩算法
- 首先标记出所有的垃圾对象
- 标记完成后,让存活的对象相空闲的一段移动
- 清理存活端以外的内存
- 分代收集算法
- 新生代:采用“复制算法”,Eden+from存储、保留to;Eden+to存储、保留from
意思就是三块区域,只使用其中的两块区域,当垃圾回收时,会将存活的对象复制到另一块区域内,然后反过来一样- 老年代:采用标记-清除算法,或者标记压缩算法
垃圾对象的判定
-
引用技术算法
为每一个对象添加一个引用计数器,伴随着引用方的增多,计数器的值也进行增多
当引用计数器的值为0时,则判定为垃圾对象,从而进行回收 -
可达性分析算法
使用“常量引用的对象”、“静态属性引用的对象”、“局部变量所引用的对象” 作为 “GC Root” 对象。
以“GC Root” 作为起始节点,一次向下查找对象简单引用关系(引用链),如果引用关系可达,则表示为存活对象;如果引用关系不可达,则表示为垃圾对象。
对于相互引用,但“GC Root”不可达的对象,也视为垃圾对象。
枚举根节点
- JVM维护了一组GC Root的集合,称为“GC Root Set”(根集合)。
- 以每个GC Root为起点,展开“可达性分析” 进而标记垃圾对象。
- 此操作必须在确保一致性的快照中进行,保证所有的引用在此期间不存在变化的情况。
- 会触发所有用户线程暂停(挂起),官方称为“Stop The World”(STW)
分代收集动作
- 新生代GC(Minor GC)
指发生在新生代的垃圾收集动作,因为新生代中大多数对象的生命周期较短,采用高效率的复制算法,回收速度快,用时少,所以Minor GC可以相对频繁,而不会过度影响用户线程
- 老年代GC(Major GC/Full GC)
指发生在这个JVM内存空间的垃圾收集动作,主要是应为老年代对象生命周期较长,并采用过程相对较慢“标记-XX”算法,Major GC的速度一般会比Minor GC 慢于回收老年代和元空间,但同时会级联回收新生代。5~10倍,触发的次数多,会影响用户线程、拖慢整个应用