抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

什么是垃圾回收

​ 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。

哪些内存需要回收?

​ 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象。那么如何找到这些对象?(如何判断一个对象是否可以被回收)

垃圾定义方式

  • 引用计数法

给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。任何时刻计数值为0的对象就是不可能再被使用的。引用计数为 0 的对象可被回收。正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。

  • 可达性分析算法

​ 通过 GC Roots 作为起始点进行搜索,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。能够到达到的对象都是存活的,不可达的对象可被回收。

GCRoots引用链

如何选取GC Roots对象呢?在Java语言中,可以作为GC Roots的对象包括下面几种:
1、虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
2、本地方法栈中JNI(Native方法)引用的对象。
3、方法区中的类静态属性引用的对象。
4、 方法区中常量引用的对象。

垃圾回收算法

  • 标记-清除算法(Mark-Sweep)

  • 复制算法(Copying) (针对新生代)

  • 标记-整理算法(Mark-Compact) (针对老年代)

  • 分代收集算法(Generational Collection)

评论