- 什么是垃圾回收
- 为什么要垃圾回收
- 垃圾在哪儿
- 怎么发现垃圾?生存?死亡
- 垃圾回收算法
- 垃圾回收器
- 内存分配与回收策略
垃圾回收(Garbage Collection,GC):就是释放垃圾占用的空间,防止内存泄露。对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
为什么要垃圾回收?
- Java 语言中一个显著特点就是引入垃圾回收机制,垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存
怎么发现垃圾?生存?死亡?
引用计数法
- 给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1,每当有一个引用失效时,计数器的值就减1,任何时刻只要对象的计数器值为0,就可以判定为垃圾对象
效率高,但JVM并没有引用计数算法,在某种场合寻找如循环引用问题
public class Test {
Test test;
public Test(String name) {}
public static void main(String[] args) {
Test a = new Test("A");
Test b = new Test("B");
a.test = b;
b.test = a;
a = null;
b = null;
}
}
即使你把 a 和 b 的引用都置为 null 了,计数器也不是 0,而是 1,因为它们指向的对象又互相指向了对方,所以无法回收这两个对象。
可达性分析法,这是jvm默认使用的寻找垃圾算法
- 原理:通过一些列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路称为引用链 “Reference Chain“,当一个对象到 GC Roots 没有任何引用链时,就说这个对象是不可达的
- Object5 和 Object6 相互引用,没有GC Roots和它们关联,可以解决循环引用的问题
- 生存?死亡?