JVM内存回收对象及引用分析

2017-08-11  本文已影响16人  撒法第

什么样的对象可以被回收

Java使用可达性分析的方法来判断某个对象是否应该被回收:

可达性分析法

如图所示,就是通过一系列的称为”GC Roots”的对象作为起始点,从这些点向下搜索,搜索的路径称为引用链,当一个对象到达GC Roots没有任何引用链时,就可以证明这个对象是不可用的。那么这个对象就可以被回收了。像图中的Obj1-5都属于存活的对象,但是Obj6-8虽然还存在相互引用,但是已经是可以认为是死掉的对象了。

引用

目前来说,Java中的引用可以分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,他们的引用顺序依次逐渐减弱。

死亡对象的自我救赎

当一个对象在进行可达性分析的时候发现已经是没有任何引用的了,这时候垃圾收集器并没有立即判处该对象死刑,而是给了它一次自我救赎的机会,这时它会被标记一次,同时判断是不是有必要执行finalize()方法,当对象没有重写finalize()方法或者finalize()方法已经被执行过的时候,就不会执行finalize()方法:

方法区的回收

方法区的回收分为废弃常量的回收和无用类的卸载:
废弃常量的回收:回收废弃常量与上面所说的堆中对象的回收差不多,没有任何引用的时候回收。
无用类的卸载:类的卸载需要满足三个条件:

上一篇 下一篇

猜你喜欢

热点阅读