JVM(尚硅谷)学习之垃圾回收相关算法

垃圾回收:标记阶段+清除阶段

标记阶段:

  • 引用计数算法:对每个对象保存一个整型的引用计数器属性

由于引用计数算法无法处理循环引用的问题,所以Java的垃圾回收器中没有使用此类算法

在python语言中使用了引用计数算法。

  • 可达性分析算法(根搜索算法、追踪性垃圾收集):

图示;

GCroots可能是哪些元素:

注意其中的小技巧,回收谁,它周边的结构就可以作为GCroots集合内的内容。

补充点:

对象的finalization机制(对象终止机制)

不要主动去调用finalize方法,如果不重写finalize方法,原本的finalize方法中是没有任何内容的。由于finalize方法的存在,对象可能会有三种状态:可触及的、可复活的、不可触及的

finalize方法只能调用一次。

判断一个对象是否可回收的具体步骤:

相当于给一个对象一次重新复活的机会,但机会仅有一次,因为每个对象的finalize方法只能调用一次。

垃圾清除阶段:

常见的算法:标记-清除算法(mark-sweep)、复制算法、标记-压缩算法

标记-清除算法:标记的是可达对象(非垃圾对象)

图示:

标记清除算法的缺点:

  • 效率不算高
  • 在进行GC时,需要停止整个应用程序,导致用户体验差
  • 这种方式清理出来的内存是不连续的,会产生内存碎片,需要维护一个空闲列表

注意:清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里,下次有对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放。

复制算法:

核心思想:

图示;

优缺点;

复制算法适用于朝生夕死的场景,所以适用于survivor区。

标记压缩算法(mark-compact):

执行过程;

标记压缩算法与标记清除算法的本质区别是标记压缩算法是一种移动式的回收算法,而标记-清除是一种非移动式的。

优点:

  • 消除了标记-清除算法中内存碎片化的问题,分配内存时,只需要持有一个内存的起始地址即可
  • 消除了复制算法中,内存减半的高额代价

缺点:

  • 从效率上来说,标记-压缩算法低于复制算法
  • 移动对象的同时,如果对象被其他对象引用,还需要调整引用的地址
  • 移动过程中,需要全程暂停用户应用程序(STW)

对比三种算法:

根据需求,使用分代收集算法:

HotSpot中的CMS回收器:

为了解决STW延迟时间较长的问题,出现了两种新的算法:

增量收集算法:

增量收集算法的缺点:

分区算法:

 

图解:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值