都知道Java对内存是自动垃圾回收的,什么样的内存是可以回收的?
这个问题是值得思考的。
对象已死的判定方法有两种:
(1)引用计数器法
给对象添加一个引用计数器,有一个地方用到此对象,计数器加一。
引用失效,计数器减一。这个判断方法实现应该简单,但是Java不用。
因为对象间的循环引用不好解决。
但是作者说微软的com技术,python等用的是这种算法。
com完全不懂,但是python难道不会遇到循环引用的问题吗?
等有时间研究下python的内存管理。
(2)根搜索算法
从gc roots开始搜索,可达的对象是存活的,不可达的对象进行回收。
这个也很容易理解。当执行到某个方法某个命令时,如果需要垃圾回收,
则把当前的方法栈当做分析开始点。当然一些全局性的对象需要考虑。
如果是函数式编程应该只考虑当前栈,我感觉。
可作为gc roots的对错有下面几种:
①虚拟机栈中引用的对象
在方法中创建的局部引用关联对象
②本地方法栈jni的引用对象
方法换成了native,道理同①。
③方法区中类静态属性引用的对象
所谓方法区在上篇中写过了,其实就是存放常态信息的
下面代码中的a如果有引用的对象,就是这种情况
④方法区中常量引用的对象
下面代码中b应该是这种情况
class AClass{ static AClass a; final static AClass b= new AClass(); //当前执行方法method… }