转载自:http://blog.sina.com.cn/s/blog_7880b6e30100ucit.html
引用计数也许是最古老的垃圾回收算法了,但一直不知道具体是怎么实现的,今天闲来无事了,想了一种实现方法,但未经实践,在此先作记录。
引言:
分析
-
一般来说,每个对象对应一个引用计数器。创建对象时,将其计数器置0。
-
当对象被赋给任意变量时,引用计数器每次加1。
-
引用变量出了作用域后,该引用变量所引用的对象的计数器减1。
-
一旦引用计数器为0,对象就满足了垃圾收集的条件。
具体实现思路如下:
-
在对象结构中添加一个域,用来保存本对象被引用的次数,创建对象时置0。
-
对象被引用时,计数器加1:
-
被实例域引用:putfield_a系列指令,在该指令中为对象的引用计数器加1.
-
类的静态域引用:针对java智能卡虚拟机的话,和包一起存亡。
-
方法的本地变量应用:astore系列指令,在该指令中为对象的引用计数器减1.
-
-
引用变量出了作用域之后,计数器减1:
由于方法调用的时候,会为该方法创建一个栈帧,当该方法正常结束,或所抛出的异常在本方法内无法被捕获的话(在本方法内能被正常捕获的话,视为正常结束),都会弹出该栈帧。
个人理解的出了作用域,就是为该方法创建的栈帧被弹出了。
故,可以这样实现:弹出栈帧的时候,检查该栈帧内所用引用的对象,并所有所引用的对象的引用计数器分别减一。
-
启动垃圾回收的时候,遍历对象表,如果引用计数器为0,则清除该对象,回收其空间;否则,什么也不做。
总结
}
Class B(){
}
void test(){
}
如果没有