🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 如何判断对象是垃圾 ### 引用计数算法 ![](https://img.kancloud.cn/2b/9b/2b9b1ff0929687ab0db88ac9ed0547ff_1350x646.png) * 定义 > 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器值为0的对象就是不可能再被使用的,也就是垃圾。 * 优点:实现简单,判断效率高 * 缺点:如果对象间出现循环引用,则无法准确判断垃圾 ### 可达性分析算法 ![](https://img.kancloud.cn/2d/37/2d373de2d5b98ead791d4b90309b65c8_1338x682.png) * 定义 > 定义一些`GC Roots`的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链。当一个对象到`GC Roots`没有任何引用链相连,则证明此对象时不可用的。 * RC Roots对象 1. 虚拟机栈(栈帧中本地变量表)中引用的对象 2. 本地方法栈中引用的对象 3. 方法区中类静态属性引用的对象 4. 方法区中常量引用的对象 Java采用的是可达性分析算法。 ## 4大引用 ![](https://img.kancloud.cn/55/c7/55c72b1e4439c984f7b95f52951f14f8_1342x722.png) 在JDK1.2之后,Java对引用的概念进行了扩充。强软弱虚,引用强度一次递减。 ## 参考资料 * 周志明 * 《深入理解Java虚拟机》