Java 对象是否可达判定算法

1.引用计数算法:

给对象添加一个引用计数器,每当有地方引用它时计数器加1;当引用失效时计数器减1;任何时刻计数器为0就是对象不可能再被使用。

特点:实现简单,效率高,但是很难解决对象之间的相互循环引用问题。

2.可达性分析算法:

思路是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始往下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象为不可用的。

如果此对象不可达,这时也不会回收,会被第一次标记后进行筛选,筛选的条件是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法或者方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。如果有必要执行finalize()方法,对象进F-Queue队列,并由Finalizer线程触发,但不一定执行完。稍后GC将对队列中的对象进行第二次小规模的标记,如果对象变为可达,则被移出“即将回收”集合,否则回收。

可作为GC Roots的对象:虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(即一般说的Native方法)引用的对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,869评论 17 311
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,020评论 2 31
  • 最近学习Python的GC机制时,想到了java的GC,忘得差不多了,(⊙﹏⊙)b!!这里便做一下回顾总结。推荐周...
    廿陆小生阅读 880评论 0 0
  • 他握紧拳头 大衣在风中 无声地发笑 袖管发稠的污血 间或淌落昏暗的十字街头 忽远忽近的鸣笛 唤不醒被拍向沙滩的水母...
    MTWTM阅读 297评论 1 3
  • 稚嫩的面容定格在相册中 爽朗的欢笑飘荡在回忆里 而回忆,停留在上一秒 你已为人妻 我也终会走向远方 过去,早已变成...
    游春阅读 252评论 0 4