GC垃圾回收

垃圾回收

  • 哪种内存需要回收?

  • 什么时候回收?

  • 怎么回收?

如何判断一个对象可以回收?

可达性分析算法

通过一个GC Roots的对象向下查找,整个搜索路径叫做引用链,当一个引用链没有 任何GC Roots说明可以回收了

可以作为GC-Roots的对象

  • 方法区中静态变量所引用的对象

  • 虚拟机栈中所引用的对象

引用计数法

每当有一个对象被引用时,引用计数器就+1,当失效时就-1,什么时候为0说明就可以回收了, 无法解决循环引用的问题

怎么回收?

标记清除算法

不需要回收的对象做一个标记,然后清除可以回收的对象

  • 标记和清除的效率不高

  • 容易产生不连续的内存

复制算法(新生代)

复制算法是将内存划分为两块大小相等的区域,每次使用时都只用其中一块区域, 当发生垃圾回收时会将存活的对象全部复制到未使用的区域,然后对之前的区域进行全部回收。 浪费内存,在jvm内存划分中的堆内存的新生代中就是用的复制算法

标记整理算法 (老年代)

原理和标记清除算法类似, 只是最后一步的清除改为了将存活对象全部移动到一端,

分代回收算法

现代多数的商用 JVM 的垃圾收集器都是采用的分代回收算法,和之前所提到的算法并没有新的内容。

Last updated