如何判断一个对象是否存活?

简介: 如何判断一个对象是否存活?

对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不再被任何途径引用的对象)。判断对象是 否存活有两种方法:引用计数法和可达性分析。

引用计数法

给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1; 任何时候计数器为 0 的对象就是不可能再被使用的。

这种方法很难解决对象之间相互循环引用的问题。比如下面的代码, obj1 和 obj2 互相引用,这种情 况下,引用计数器的值都是1,不会被垃圾回收。

publicclassReferenceCount {
Objectinstance=null;
publicstaticvoidmain(String[] args) {
ReferenceCountobj1=newReferenceCount();
ReferenceCountobj2=newReferenceCount();
obj1.instance=obj2;
obj2.instance=obj1;
obj1=null;
obj2=null;
    }
}

可达性分析

通过 GC Root 对象为起点,从这些节点向下搜索,搜索所走过的路径叫引用链,当一个对象到 GC Root 没有任何的引用链相连时,说明这个对象是不可用的。

image.png

可作为GC Roots的对象有哪些?

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

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

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

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

相关文章
|
7月前
|
算法 Java 程序员
JVM-如何判断对象可以回收
JVM-如何判断对象可以回收
|
存储 缓存 算法
13-大厂面试题:为什么要垃圾回收以及如何判断对象可以回收
接下来我们正式进入第二个系列,关于垃圾回收以及优化。
110 0
13-大厂面试题:为什么要垃圾回收以及如何判断对象可以回收
|
7月前
|
算法 Java
JVM中判断对象是否需要回收的方法
JVM中判断对象是否需要回收的方法
判断主机是否存活的优雅方式
对于判断主机是否存活的时候,不能只ping一次就下结论,对于其他业务类似。因此应该增加重试次数。采用三种方式实现。
126 0
|
7月前
|
缓存 算法 Java
在JVM中 判定哪些对象是垃圾?
在JVM中 判定哪些对象是垃圾?
|
算法 安全 Java
18-动态对象年龄判断+空间分配担保规则+老年代回收算法
本文中用到的案例是接着上一篇文章继续的,如果有不清楚同学请先查看上一篇文章
146 0
 18-动态对象年龄判断+空间分配担保规则+老年代回收算法
|
Java
16-内存分配与回收策略-对象优先分配Eden+大对象进老年代
大多数情况下, 对象在新生代Eden区中分配。 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC。HotSpot虚拟机提供了-XX: +PrintGCDetails这个收集器日志参数, 告诉虚拟机在发生垃圾收集行为时打印内存回收日志, 并且在进程退出的时候输出当前的内存各区域分配情况。 在实际的问题排查中, 收集器日志常会打印到文件后通过工具进行分析 。
116 0
16-内存分配与回收策略-对象优先分配Eden+大对象进老年代
|
缓存 算法 Java
内存管理:判断对象是否存活
在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对 Java 堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)。 有两种判断对象是否存活的算法:引用计数算法、可达性分析算法。
133 0
内存管理:判断对象是否存活
|
算法 Java 关系型数据库
引用计数 vs 根可达算法:深入比较对象存活判定
引用计数 vs 根可达算法:深入比较对象存活判定
222 0
|
缓存 算法 Java
JVM 判断对象是否还活着的两种方法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
107 0