JVM 判断删除对象
引用计数法
引用计数法 (reference counting) :
- 当用该对象,就用计数器 + 1
- 当放弃该对象,就用计数器 - 1
- 当计数器为 0 时 ,就说明可以释放了
问题 : 当对象之间互相引用 ,就会产生依赖关系,就会导致无法释放,出现内存泄漏
- 当内存太满 ,就会导致内存溢出
Python,PHP 就用的引用计数法 (优化过)
可达性分析算法
该算法的思想 : 通过 GC Roots 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链
- 当对象到 GC Roots 没有任何引用链相连,就表示此对象是不可用,需要被回收
Object 6 ~ Object 10
之间到 GC Roots 不可达 : 被回收的对象
GC Roots 的对象
- 虚拟机栈 (栈帧中的本地变量表) 中引用的对象
- 本地方法栈 (Native 方法) 中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 所有被同步锁持有的对象
无用的类的 3 个条件 :
- 该类所有的实例都被回收
- 加载该类的 ClassLoader 已被回收
- 该类的
java.lang.Class
对象没被引用
引用类型
JDK1.2 后,对引用分 (引用强度 : 逐渐减弱) :强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference)
强引用 : GC 不会回收它 , 报 OOM 都不会
- 对象引用变量 :
Objectobj=newObject();
- 实例变量 :
this.data = data;
- 静态变量 :
public static final String CPU_CODE="cpucode";
软引用 : 当内存足够,不会回收,只有当内存不足时,就会回收这些对象的内存
SoftReference<Object> softRef = new SoftReference<>(bigObject);
弱引用 : 只要被发现 ,就回收
WeakReference<byte[]> cacheRef = new WeakReference<>(cacheData);
虚引用 : 任何时候都可能被回收
PhantomReference