1. 什么是垃圾回收
    2. 为什么要垃圾回收
    3. 垃圾在哪儿
    4. 怎么发现垃圾?生存?死亡
    5. 垃圾回收算法
    6. 垃圾回收器
    7. 内存分配与回收策略

    垃圾回收(Garbage Collection,GC):就是释放垃圾占用的空间,防止内存泄露。对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。

    为什么要垃圾回收?

    • Java 语言中一个显著特点就是引入垃圾回收机制,垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存

    怎么发现垃圾?生存?死亡?

    1. 引用计数法

      1. 给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1,每当有一个引用失效时,计数器的值就减1,任何时刻只要对象的计数器值为0,就可以判定为垃圾对象
      2. 效率高,但JVM并没有引用计数算法,在某种场合寻找如循环引用问题

        1. public class Test {
        2. Test test;
        3. public Test(String name) {}
        4. public static void main(String[] args) {
        5. Test a = new Test("A");
        6. Test b = new Test("B");
        7. a.test = b;
        8. b.test = a;
        9. a = null;
        10. b = null;
        11. }
        12. }

        即使你把 a 和 b 的引用都置为 null 了,计数器也不是 0,而是 1,因为它们指向的对象又互相指向了对方,所以无法回收这两个对象。

    2. 可达性分析法,这是jvm默认使用的寻找垃圾算法

      1. 原理:通过一些列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路称为引用链 “Reference Chain“,当一个对象到 GC Roots 没有任何引用链时,就说这个对象是不可达的
      2. image.png
      3. Object5 和 Object6 相互引用,没有GC Roots和它们关联,可以解决循环引用的问题
    1. 生存?死亡?

    image.png