JVM垃圾回收算法

垃圾收集算法

  • 使用某种既定规则,完成对JVM无用对象空间的清理
  • 各种回收算法实现的思路不一样,所需的时间消耗与空间占用也不同
  • 无论哪种回收算法都希望提高应用程序性能的同时,尽量保证时间与空间的平衡

方式

  1. 标记-清除算法
  • 首先标记出所有的垃圾对象
  • 标记完成之后统一回收被标记对象

在这里插入图片描述

  1. 复制算法
  • 将内存划分成两个相同的空间,内次只使用其中的一半
  • 将存货对象复制到另外一块保留区域后,一次性清除原有空间

在这里插入图片描述

  1. 标记-压缩算法
  • 首先标记出所有的垃圾对象
  • 标记完成后,让存活的对象相空闲的一段移动
  • 清理存活端以外的内存

在这里插入图片描述

  1. 分代收集算法
  • 新生代:采用“复制算法”,Eden+from存储、保留to;Eden+to存储、保留from
    意思就是三块区域,只使用其中的两块区域,当垃圾回收时,会将存活的对象复制到另一块区域内,然后反过来一样
  • 老年代:采用标记-清除算法,或者标记压缩算法

在这里插入图片描述

垃圾对象的判定

  1. 引用技术算法

    为每一个对象添加一个引用计数器,伴随着引用方的增多,计数器的值也进行增多
    当引用计数器的值为0时,则判定为垃圾对象,从而进行回收

  2. 可达性分析算法

    使用“常量引用的对象”、“静态属性引用的对象”、“局部变量所引用的对象” 作为 “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倍,触发的次数多,会影响用户线程、拖慢整个应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值