3.2.2可达性分析算法(gold_axe)

这个确定对象是不是还有用 ,可以不可以扔掉 的算法
不止是Java在用, 主流的商用语言都是这个

基本思路:
以一些 GC Roots 作为跟, 向下搜索,
走过的路径叫引用链, 没走到的,就是不可达
不可达的 就是 没用了的

Java里面可作为GC Roots的

虚拟机栈/本地方法栈 中引用的对象

就是个线程在运行的方法里面用到的对象

方法区中 类静态属性/常量 引用的对象

就是是属于类的static field 和final static field

被作为锁的对象
反应JVM内部情况的对象
其他不回收的区域,可能对本区域引用的对象

4种引用

强
软

空间不足一段时间后, 才会迫不得已回收它们
适合做缓存

弱

活不过下次回收,

这个在ThreadLocal 里面用到了,
既可以通过这个引用拿到threadLocal 对象,
如果其他强引用(来自各个线程的引用)不在了, 定义这个static threadLocal 的class里面对 threadLocal 的引用 不会阻止其被回收

虚

作用是 回收时可以得到通知

finalize()

这个方法没啥用 ,不要用

某对象 如果 没在引用链上,就是是死的
会看它是否有覆盖finalize 方法,
如果有写finalize方法,并且没执行过
就会放到一个F-Queue队列里面,

有一个优先级很低的线程, 过一会儿来运行, 但是不保证给你运行完, 如果花费太大就算了

如果在finalize里面写的 xxx=this 再给建立一个引用 把他救活 是可以的
但是只能这么做一次, 下次回收 发现又没有引用的话

这个对象finalize已经被执行过了, 是不会被再次执行的

二次标记:
指的是 finalize 里面是可以救 这个对象的
通过再次建立引用, 把这个对象移出 待回收 的集合

方法区 的回收

又叫类卸载
虚拟机规范里面, 没有要求 一定要对 方法区进行回收, 确实也有收集器(11的ZGC)没有类卸载
类卸载, 条件苛刻,收效甚微

但是,现在动态代理 CGLib字节码框架,动态生成类,OSGI频繁自定义类加载器, JVM比较小 可以类卸载

以下条件是 类不再被需要,可以被卸载的 必要条件(非充分):

  • 没实例了
  • 类加载器 没了
  • 对应的Class对象 没了

以上↑ 是必要条件
实际上, 什么样的情况运行类卸载 , 可通过参数自己控制
可以查看 类加载 类卸载信息

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,294评论 0赞 8
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,740评论 1赞 4
  • 当我们的程序开启运行之后就,就会在我们的java堆中不断的产生新的对象,而这是需要占用我们的存储空间的,因为创建一...
    java菜阅读 887评论 0赞 0
  • 第二部分 自动内存管理机制 第二章 java内存异常与内存溢出异常 运行数据区域 程序计数器:当前线程所执行的字节...
    小明oh阅读 1,340评论 0赞 2
  • 1 述 对象的回收判定通常有两种算法 : 引用计数算法和可达性分析算法。判定对象是否存活(需要回收)都与“引用”有...
    凯玲之恋阅读 1,761评论 2赞 3

友情链接更多精彩内容