前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >判断对象状态的算法及GC算法

判断对象状态的算法及GC算法

作者头像
BUG弄潮儿
发布2020-06-15 16:34:39
6620
发布2020-06-15 16:34:39
举报
文章被收录于专栏:JAVA乐园JAVA乐园

要执行垃圾回收(GC),需要先判断对象是否还被引用,用通俗的话讲,就是需要判断对象是否还存在引用,那么如何判断呢?判断对象状态的算法有哪些呢?

0x01:引用计数算法

顾名思义,通过判断对象是否还被引用,来判定是否可以进行回收。当对象被引用则将引用次数+1,当不再引用则-1,引用次数为0,则代表没有对象引用。当对象没有被引用时,则可能被GC回收。这种算法的优点是:高效。缺点是:循环引用的情况无法有效回收(所谓循环引用:也就是A引用B,同时B也引用A),所以当前主流判断对象是否还被引用,并不采用该算法。

0x02:可达性分析算法

从GC Root的根开始向下搜索,当遇到对象与Root之间无关联时,则标记为可以被回收。那么什么样的对象可以作为Root呢?

下面是基于以上两种常见的GC算法:

  • 标记—清除算法:所谓标记-清除算法,就是进行遍历,筛选出可以回收的对象,做标记。这种算法的主要缺点是,标记清除之后,会产生很多碎片化的空间。
  • 复制算法:如何避免出现很多碎片化的空间呢,于是出现了复制算法,将内存空间一分为二,每次只使用一半的空间,当使用完毕,则将还存活的对象复制到另外一半上面。这种算法的缺点是,每次内存的利用率只有一半。当然,如果对象的存活率很高,复制效率也会相对比较低。
  • 标记—整理算法:考虑到对象存活率高,复制算法效率会比较低,可以采用标记-整理算法,将不再引用的对象进行移动移动整理到某个边界位置,然后将边界外的对象进行统一清理。
  • 分代收集算法:当前主流的JVM大都采用分代收集算法,也就是说根据不同的区域,使用不同的算法。例如新生代,存活率比较低,可以采用复制算法;老年代,存活率很高,可以采用标记-清除或者标记-整理算法。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档