为什么要判断对象是否存活呢?
虚拟机中几乎所有的对象都要在堆内存中分配存储区域,而如果要进行垃圾回收就得判断哪些对象是”死掉“的,什么情况下可以判断某个对象是“死掉”的呢?当然是这个对象的存在已经对程序做不了任何贡献的时候,也就是说没有任何对象会再使用到这个对象了。
再说一遍,判断对象是否存活是在垃圾回收之前的一步至关重要的事情!
再说一遍,判断对象是否存活是在垃圾回收之前的一步至关重要的事情!
再说一遍,判断对象是否存活是在垃圾回收之前的一步至关重要的事情!
有两种算法可用于判断对象是否存活:
引用计数器算法:
1:原理:给每个对象添加一个引用计数器,当有一个对象引用它时,就加1,当引用失效时,就减1.当任何对象的引用计数器的值为0时,这个对象就不会在被引用,就会被判定对象已死。DEAD! DEAD! DEAD!
2:优点:实现简单,判定效率高
3:缺点:很难解决对象直接循环引用的问题
潜意识告诉我这个算法应该没什么人会用,但其实微软的COM技术,使用ActionScript3的FlashPlayer,Python语言和在游戏脚本领域被广泛使用的Squirrel都使用引用计数器算法来管理内存
可达性分析算法:
首先确定引用根节点,那些对象可以被认为是引用根节点呢????
1:虚拟机栈中局部变量表中引用的对象(什么是虚拟机栈?虚拟机栈存放线程访问的各个方法,什么是局部变量表?局部变量表是虚拟机栈中栈帧【方法】中定义的变量和方法间传递的参数)
2:本地方法栈中native方法引用的对象
3:方法区中静态属性引用的对象(方法区是所有线程共享的,存放各个类的信息,常量,静态变量等)
4:方法区中常量引用的对象
以上面条件选区的GC根节点为初始节点开始向下搜索,跟该节点相关的对象,会在两者之间建立引用链。当其他对象跟根节点及由根节点形成的引用链树没有关联时,就可以对这些对象说拜拜了
加一条:这些未跟GC根节点相关联的对象,其实并不会在第一次垃圾回收的时候就被回收。会在第一次回收时打个标记,在第二次的垃圾回收时进行回收
网友评论