JVM(3)--垃圾回收前对象已死的判断

在堆里面存放着几乎所有的对象实例,堆也是垃圾回收的主要区域,那么要怎么判断哪些对象可回收,哪些不可回收呢。

下面有两个判断的算法,引用计数算法,可达性分析算法

(1)引用计数算法:在对象中添加一个计数器。每当有地方引用它时,计数器加一,引用失效时减一。在任何时候计数器为0的对象就是可回收对象。

但是这个算法有一个问题,当对象之间互相引用,计数器永不为0,也就没办法进行判断了。

虚拟机并不通过此算法进行判断。

(2)可达性分析算法:通过一系列成为“GCRoots”的对象,向下搜索,搜索所走过的路线成为引用链。若是一个对象无法通过任何引用链和GCRoots相连接,则说明该对象不可达。

在Java中,可被作为GCRoots的对象有以下几种

1.虚拟机栈中引用的对象

2.方法区中静态属性引用的对象

3.方法区中常量引用的对象

4.本地方法栈中引用的对象

 

当一个对象标记为不可达时,并不一定会被回收,还有一次拯救自己的机会。在第一次判断中发现对象不可达,对对象进行第一次标记,如果对象有重写finalize()方法,并且在方法里面让自己可达,则对象可以不被清理,否则其他任意情况在第二次可达性分析判断中被清理。

 

在方法区中,也是有垃圾回收的。特别是在大量使用反射,动态代理等场景中,虚拟机必须具有卸载类的能力,可以通过JVM参数进行控制。

posted @ 2018-07-31 16:57  蒋曾  阅读(136)  评论(0编辑  收藏  举报