## 如何判断对象是垃圾
### 引用计数算法
![](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虚拟机》
- 面试突击
- Java虚拟机
- 认识字节码
- 000Java发展历史
- 000Macos10.15.7上编译OpenJDK8u
- 001熟悉Java内存区域
- 002熟悉HotSpot中的对象
- 003Java如何计算对象大小
- 004垃圾判定算法与4大引用
- 005回收堆和方法区中对象
- 006垃圾收集算法
- 007HotSpot虚拟机垃圾算法实现篇1
- 007HotSpot虚拟机垃圾算法实现篇2
- 007HotSpot虚拟机垃圾算法实现篇3
- 008垃圾收集器
- 009内存分配与回收策略
- 010Java虚拟机相关工具
- 011调优案例分析
- 012一次IDEA的启动速度调优
- 013类文件Class的结构
- 014熟悉字节码指令
- 015类加载机制(过程)
- 016类加载器
- IDEA的JVM参数
- Java基础
- Java自动装箱与拆箱
- Java基础数据类型
- Java方法的参数传递
- Java并发
- 001走入并行的世界
- 002并行程序基础
- 003熟悉Java内存模型JMM
- 004Java并发之volatile关键字
- 005线程池入门到精通
- 006Java多线程间的同步控制方法
- 007Java维基准测试框架JMH
- 008Java并发容器
- 009Java的线程实现
- 010Java关键字synchronized
- 011一些并行模式的熟悉
- 单例模式和不变模式
- 生产者消费者模式
- Future模式
- 012一些并行算法的熟悉
- 面试总结
- 长亮一面