龙空技术网

如何判断java对象已死?

程序员Share 231

前言:

目前你们对“java如何判断对象是否存活了数据”大概比较关心,我们都想要学习一些“java如何判断对象是否存活了数据”的相关文章。那么小编也在网上网罗了一些有关“java如何判断对象是否存活了数据””的相关资讯,希望朋友们能喜欢,兄弟们一起来了解一下吧!

JAVA对象已死?

堆中几乎存放着Java所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象有哪些还“存活”着,哪些已经“死去”。

判断对象是否已死的方法包括

1、引用计数算法判断

很多书里判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。

客观地说,引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM(Component Object Model)技术、Python语言以及在游戏脚本领域中被广泛应用的Squirrel中都使用了引用计数算法进行内存管理。但是,Java语言中没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用的问题。

2、根搜索算法

在主流的商用程序语言中(Java和C#),都是使用根搜索算法(GC Roots Tracing)判定对象是否存活的。这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。如下图所示,对象object 5、object 6虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。

在Java语言里,可作为GC Roots的对象包括下面几种:

虚拟机栈中的引用的对象。

方法区中的类静态属性引用的对象。

方法区中的常量引用的对象。

本地方法栈中JNI(即一般说的Native方法)的引用的对象。

标签: #java如何判断对象是否存活了数据