天天看点

【对象的生死判定】

垃圾回收

JAVA有一个很大的好处就是,不用自己管理内存,虚拟机帮助开发者完成了这些操作。所以这是好是坏呢?不敢苟同。

对象生死

垃圾的定义:垃圾回收肯定是要知道怎么定义垃圾。简单点说就是,已经被用过了,并且不会再用了,而且还在内存里面的对象,就是垃圾。因为他占着资源。

如何判断垃圾:现在常用的两种方法,引用计数法和可达性分析。

引用计数:这个其实是一个很不错的方法,思想也很简单,如果一个对象被引用了,那么就给它的生命力++,如果引用它的人生命结束了,那么它的生命就减一。最后看看谁生命值是0,那么就判定他是垃圾。嗯,不错的一个方案,实现起来也很简单。

引用计数存在的问题:

【对象的生死判定】

但是在这种情况下,就不是很好了,这种情况被称之为循环引用,A引用了B,B又引用了A,那么他俩的生命力得到了对方的加持,一直不为0,就一直存活。

可达性分析:其实这种情况,抽象一下就是出现了环路。从图论的角度来看,这个引用关系构成的图应该是一个DAG(有向无环图),一旦环路存在,那么就会出现上述问题。继续考虑,其实都考虑到图论这来了,那么这个问题的解就显而易见了:所有的应用关系构成了有向图,如果有些连通分量里面的所有点都没被用过,那么这个连通分量可以被丢弃。

【对象的生死判定】

比如这个图,左边存在环路,右边也可能存在。虚拟机中有一个GC ROOT,即使这些点的计数不为0,当GC ROOT不可达的时候,那么这些连通分量里面的对象依然会被回收。

死缓

继续阅读