首页 > 学院 > 开发设计 > 正文

第五章 判断对象是否存活算法

2019-11-08 00:56:49
字体:
来源:转载
供稿:网友

垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象有哪些还”存活”着,哪些已经”死去”。

引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器都为0的对象就是不可能再被使用的。但是java并没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用的问题。

如下例所示,对象objA和objB都有字段instance,赋值令objA.instance = objB及objB.instance = objA,除此之外,这两个对象再无任何引用,实际上这两个对象已经不可能再被访问,但是它们因为互相引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。

package demo4;public class ReferenceCountingGc { public Object instance = null; PRivate static final int _1MB = 1024 * 1024; private byte[] bigSize = new byte[2 * _1MB]; public static void testGC() { ReferenceCountingGc objA = new ReferenceCountingGc(); ReferenceCountingGc objB = new ReferenceCountingGc(); objA.instance = objB; objB.instance = objA; objA = null; objB = null; System.gc(); }}

根搜索算法

这个算法的基本思路就是通过一系列的名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。在JAVA语言中,可作为GC Roots的对象包括以下几种

虚拟机栈(栈帧中的本地变量表)中的引用的对象 方法区中的类静态属性引用的对象 方法区中的常量引用的对象 本地方法栈中JNI(即一般说的Native方法)的引用的对象


上一篇:extern "C"

下一篇:N0319-Bulb Switcher

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表