首页 > 编程语言 > 详细

判断Java对象生死的方式

时间:2015-10-29 02:07:57      阅读:445      评论:0      收藏:0      [点我收藏+]

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已经是不可达了,其实已经没人用了,可以回收了。


bubuko.com,布布扣
?在Java语言中,可作为GC Roots对象的包括以下几种:

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

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

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

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

?

判断Java对象生死的方式

原文:http://hejiawangjava.iteye.com/blog/2252690

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!