`
dbp_cn
  • 浏览: 85634 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

怎么判断对象已死

阅读更多

堆中几乎存放这Java世界中所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象有哪些还"存活"着,哪些已经"死去"(即不可能再被任何途径使用的对象)。

1,引用计数算法

  给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;任何时刻计数器都为0的对象就是不可能再被使用的。客观地讲,引用计数法的实现简单,判定效率也高,但Java中没有选用其来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用的问题。

 例子:

   如下代码,对象objA和objB都有字段instance,赋值令objA.instance=objB 及objB.instance=objA,除此之外,这量个对象再无任何引用,但是他们之间因为相互引用着对方,导致它们的引用计数都不为0,于是引用计数法无法通知GC收集器回收它们。 

public class RefGC{
    
    public Object instance=null;
    private static final int _1MB=1024*1024;

   //给变量赋予一定内存,
    private byte[] bigSize=new byte[2 * _1MB];
  
  public static void tesetGC(){
     RefGC objA=new RefGC();
     RefGC objB=new RefGC();
     objA.instance=objB;
    objB.instance=objA;
   
   objA=null
   objB=null;

   System.gc();
  }
}

  2,跟搜索算法 

    在主流的商用程序语言中,都是使用根搜索算法(GC Root Tracing)判定对象是否存活的。这个算法的基本思路是通过一系列的名为"GC Roots"的对象作为起点,从这些结点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC roots 没有任何引用链相连时,则证明次对象是不可用的。

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

   1)虚拟机栈(栈桢中的本地变量表)中引用的对象。

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

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

   4)本地方法栈中JNI(Native方法)的引用对象。

分享到:
评论

相关推荐

    jvm如何判断对象己死详解

    本文将详细讲解JVM如何判断对象已死的两种主要算法:引用计数算法和可达性分析算法,以及JDK 1.2之后引入的不同类型的引用。 首先,我们来看引用计数算法。这是一种简单的对象存活判断方法,为每个对象添加一个引用...

    JVM的GC如何判断对象是否死亡?

    【JVM的GC如何判断对象是否死亡】 在Java的虚拟机(JVM)中,垃圾收集(GC)机制是自动管理内存的关键部分。它负责识别并清除那些不再使用的对象,以便释放内存资源。理解GC如何判断对象是否死亡是优化Java应用程序...

    【05-面向对象(下)】

    •Object类提供的equals方法判断两个对象相等的标准与==完全相同。因此开发者通常需要重写equals方法。 类成员 •在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用...

    2022法医学重点整理参照.pdf

    假死是指人体的循环、呼吸和脑的功能活动高度抑制,生命活动极微弱,用一般临床检查方法检查不出生命体征,外表看来好像人已死亡,而实际上还活着的一种状态。假死的诊断包括线扎指头、微弱呼吸检查、ECG 检查、X 线...

    JVM 面试题总结.md

    判断对象是否已死主要依据两个标准: 1. **引用计数法**:记录对象被引用的数量,当数量为0时则认为对象可被回收。但这种方法无法解决对象相互循环引用的问题。 2. **可达性分析算法**:从一组根对象出发,如果一个...

    Java JVM 面试题总结

    判断对象是否可被回收通常采用可达性分析算法,如果从GC Roots出发,没有任何引用链可以到达某个对象,则认为该对象已经“死掉”,可以被回收。GC Roots一般包括以下几种: - 正在执行的方法栈中的局部变量。 - ...

    一文详解java内存管理机的垃圾标记.docx

    这是目前主流的判断对象是否存活的方式。通过从一组称为GC Roots的对象开始,沿着引用链向下搜索。如果一个对象不能从GC Roots到达,那么它被认为是不可达的,可以被回收。可达性分析可以有效解决循环引用的问题,但...

    最新java面试题(基础部分)

    可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GC Roots”对象(虚拟机栈中引用的对象、静态属性引用对象)作为...

    java程序员面试

    - **可达性分析算法**:从一组根节点开始向下搜索,若对象不可达,则认为该对象已死。常见的根节点包括:静态变量中的引用、方法调用栈中的局部变量等。 **3.3 几种垃圾回收机制** - **标记-清除收集器**:先标记...

    机械性损伤英文版.pptx

    - 区分生前伤与死后伤:判断伤痕是在生前还是死后形成的。 - 判断致伤物:与活体鉴定相同,确认造成死亡的物体。 - 受伤时间:推断伤害发生的时间。 - 个人身份识别:通过身体特征确认死者身份。 尸体鉴定的...

    博弈五子棋实验报告参考.pdf

    * 判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予10000分,如果是人方的话给予-10000分。 * 判断是否已成双活3,如果是机器方的话给予5000分,如果是人方的话给予-5000分。 * 判断是否成死3活3,...

    练习题(含答案)_c++oj答案_c++类oj习题_

    这个压缩包文件"练习题(含答案)_c++oj答案_c++类oj习题_"似乎包含了一系列关于C++类与对象的在线判断题(Online Judge, OJ)解答,这对于学习者来说是一个宝贵的资源,可以帮助他们检验和提升在类和对象方面的理解...

    jvm_learn_note.pdf

    它主要通过两种算法来判断对象是否死亡: 1. **引用计数算法**:简单但无法处理循环引用问题。 2. **可达性分析算法**:从GC Roots开始遍历引用链,无法到达的对象视为可回收。 垃圾收集器还分为不同类别,如: -...

    常见的面试题21232.pdf

    - **可达性分析算法**:以GC Roots对象为起点,遍历引用链,找不到引用的对象被视为不可达,进而判断为可回收。 6. **垃圾收集器**: - **CMS(Concurrent Mark Sweep)收集器**:采用Mark-Sweep算法,可能导致...

    五子棋AI算法

    * 判断是否能成活 4 或者是双死 4 或者是死 4,如果是机器方的话给予 10000 分,如果是人方的话给予-10000 分; * 判断是否已成双活 3,如果是机器方的话给予 5000 分,如果是人方的话给予-5000 分; * 判断是否成...

    最新java面试题及答案

    答案是,可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GC Roots”对象(虚拟机栈中引用的对象、静态属性引用...

    JVM的工作原理及垃圾回收机制介绍

    当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。 - **标记-整理算法 (Mark-Compact)**:先标记待删除的对象,然后将存活的对象都向一端移动,随后清理掉端边界...

    JVM常用知识(面试可用)

    - **判断对象是否已死**:引用计数法和可达性分析算法(GCRoots)。 - **垃圾收集算法**:标记-清除、复制、标记-整理和分代收集算法。 - **垃圾收集器**:新生代有Serial、ParNew和Parallel Scavenge,老年代有...

    软件测试与维护:6-dataflow-testing.pdf

    2. (k) 杀死、未定义、释放:对象不再需要或其状态被改变,如赋新值或文件关闭。 3. (u) 使用:对象参与计算(c)或作为条件判断的一部分(p)。 以以下示例程序为例: ```c 1. read (x, y); 2. z = x + 2; 3. if (z ) ...

    基于芯片介电电泳的细胞特性分析及种类判断.pdf

    在细胞样品的选择上,研究者们选择红细胞(RBC)、白细胞(WBC)和活死状态的HepG2肝癌细胞作为分析对象。通过芯片介电泳临界频率测定法,确定了不同细胞类型的临界频率,并在此基础上,提取了表征细胞生物状态的...

Global site tag (gtag.js) - Google Analytics