💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
欢迎关注我的公众号: ![我的公众号](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png) # 1、引用计数法 给对象添加一个引用计数器,每有一个地方引用时,计数器加 1,当一个引用失效时,计数器减 1,任何时刻引用计数器为 0 的对象就被判定为可回收对象。 ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190617174733.png) 优点:简单,高效 缺点:不能解决两个引用循环引用的问题。 # 2、可达性分析法 从 GC roots (每种具体实现对GC ROOTS 有不同的实现)作为起点,向下搜索它引用的对象,可以生成一颗引用树,树的节点是为可达对象。如果对象不在树的节点上,则视为可回收对象。 ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190617175046.png) 这里即使是有循环引用,但是 GC ROOTS 不可达,仍然是可以被回收的。 Java 定义的 GC ROOTS 的对象: 1. 虚拟机栈(栈帧中的本地变量表)中引用的对象(参考下图) **栈帧在线程私有的虚拟机栈中,一个虚拟栈中有多个栈帧的存在,每个栈帧对应一个方法** 2. 方法区的类静态属性引用的对象 **方法区是永久代,基本不会被销毁** 3. 方法区中的常量引用的对象 **常量不会被更改,也在方法区,无用的会被清除** 4. 本地方法栈中 JNI 引用的对象 **这个也属于线程私有的本地方法栈中,使用 native 方法的对象** 参考图片: ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190710150107.png)![](https://box.kancloud.cn/ba979303e73da130c1e39b227a624c72_1982x1478.png)