判断Java对象生死的方式

my git : https://github.com/hejiawang

 

Java虚拟机学习记录整理。

 

一、在Java垃圾回收器清理垃圾对象之前,首先要做的事就是判断哪些对象没人用了、死了、可以回收了;哪些对象还有人用,还活着,不能进行回收。那么垃圾回收器是怎么判断Java对象是生是死呢?

 

二、引用计数算法

       引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它,计数器值就加一,当引用失效,也就是用完了的时候,计数器值就减一,任何时刻计数器值为0的对象,就是没人用的对象,说明该对象可以去死了,那么垃圾回收器将该垃圾对象回收。

       引用计数算法的实现简单,判断效率很高,但是在Java虚拟机中,使用引用计数算法不能达到理想效果,因为引用计数算法很难解决对象之间相互循环引用的问题。比如如下代码:

A a = new A();
B b = new B();
a.aB = b;//A类中有B属性
b.bA = a;//B类中有A属性

        除了上面的引用之外,对象a和b再无任何引用。

        实际上,这两个对象已经没用了,应该进行垃圾收集了,但是他们因为互相引用着对方,导致引用计数的值始终不能为0,于是引用计数算法无法通知垃圾收集器回收它们。

        可见这种引用计数算法在Java虚拟机中管理内存是不可用的。但是用处还是很大的,在其他虚拟机中有用引用计数算法管理内存的。

 

三、可达性分析算法

        可达性分析算法的基本思路:通过一系列的称为“GC Roots”的对象作为起点,从这些起点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则正面此对象是不可用的。

       就像下图中,对象Object5,Object6,Object7,虽然相互之间相互关联,但是它们到GC Roots已经是不可达了,其实已经没人用了,可以回收了。


判断Java对象生死的方式_第1张图片
 在Java语言中,可作为GC Roots对象的包括以下几种:

        1、虚拟机栈(栈帧中的本地变量的表)中引用的对象;

        2、方法区中类静态属性引用的对象;

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

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

 

你可能感兴趣的:(对象,生死)