怎么判断一个对象已经死亡,我们不如先说说什么才是对象死亡,一个对象死亡,其实就是这个对象不可能再被使用了,所以我们需要判断一个对象是否死亡。
这里有两种方法,引用计数法和可达性分析算法
引用计数算法
给对象添加一个引用计数器,当对象被引用一次,这个计数器就加1,但引用失效,这个计数器就减1。
只要这个计数器为0的时候,就代表这个对象不可能再被使用了。
可达性分析算法
这里要牵扯一个叫做GC Root的东西,这里先假想GC Root是一块土壤好了,任何从土壤里面长出来的植物,都属于这个土壤,而土壤上面的东西,没有从土壤内部长出来的东西,就不属于这块土壤,比如别人丢的瓶瓶罐罐啊什么的,就称作垃圾。
故事先讲到这里,我们来讲讲什么是可达性分析,可达性分析其实就是这里有一个GC Root,变量最开始肯定是写在这上面的,比如有这样一个关系:
GC Root -> object1 ->object2 ->...
这里其实应该点树的意思。。树的跟节点在GC Root上面,每个对象都可以通过父节点到达GC Root,这一条引用,称为引用链,当引用链直接能连接到GC Root的时候,则证明这个对象是被使用的,不应该被回收,当引用链没有直接连接到GC Root的时候,则整个树都可以被回收。
不过需要注意的是,可达性分析的算法,并不是发现你的引用链没有到GC Root,就把你回收了,而是会给你一次重新做人的机会,如果下次来检查还是发现你的引用链没有到GC Root,才会把你回收了,所以第一次检查发现引用链没有到GC Root的时候,会给你做一个标记。
举个例子:
int a = 0;
int b = 0;
a = b;
b = a;
这里本来开始是这样的:
GC Root->a
GC Root->b
后来变成了
GC Root->a->b
最后变成了
...b->a->b->a->b...
已经找不到GC Root了,所以这两个都会被回收。
注:下图跟上述例子无关
可达性分析.jpg
网友评论