精华内容
下载资源
问答
  • 判断对象是否存活的方法主要两种:引用计数算法,可达性分析算法 引用计数算法 给对象添加一个引用计数器,当一个地方引用它时,引用计数器+1,当一个引用失效时,引用计数器-1,引用计数器为0时,表示对象不...

    判断对象是否存活的方法主要有两种:引用计数算法可达性分析算法

    引用计数算法

    给对象添加一个引用计数器,当有一个地方引用它时,引用计数器+1,当有一个引用失效时,引用计数器-1,引用计数器为0时,表示对象不可能再被使用。

    这个方法实现简单,判断效率高,但是不能解决对象之间循环引用的问题。
    比如两个对象相互持有对方的引用,除此之外,再无其他引用,实际上这两个对象已经不能再被访问,但是因为它们互相引用对方,导致引用计数器不为0,导致垃圾收集器不能回收它们。

    可达性分析算法

    java,C#都是通过可达性分析算法来判断对象是否存活的。基本思路是通过一系列的“GC roots”对象为起点,从这些节点向下搜索,走过的路径称为引用链,当一个对象到GC roots没有任何引用链相连时,则表明此对象是不可用的。
    如下图所示,对象5,6,7是不可用的
    在这里插入图片描述
    在java中可作为GC roots的对象有以下几种:

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

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

    方法区中常量引用的对象

    本地方法栈中JNI(native方法)引用的对象

    对象真正死亡

    即使在可达性分析算法中不可达的对象,也并非是一定会死亡的,这时候它们处于“缓刑”阶段,要真正宣告一个对象的死亡,至少要经历两次标记过程。如果对象在可达性分析之后,发现没有与GC roots连接的引用链,它将会被第一次标记并进行一次筛选,筛选条件是,此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,则虚拟机认为没有必要执行finalize()方法。

    如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个叫F-Queue的队列之中,并在稍后由一个被虚拟机建立的,低优先级的Finalize线程去执行它。这个所谓的“执行”,指虚拟机会触发这个方法,但不承诺会等待它运行结束。

    finalize()方法是对象逃脱死亡命运的最后机会,稍后GC会对F-Queue中的对象进行第二次标记,如果对象要在finalize()中拯救自己,只要与引用链上的任一对象建立关联即可,比如把自己(this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时,它将会被移出“即将回收”的集合。若对象这时候还没有逃脱,那基本上它就真的被回收了。

    如果对象逃脱了,当面临下一次回收时,它的finalize()方法不会被再此执行。

    展开全文
  • 对象中添加一个引用计数器,每当一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。 这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个...

    一、对象标记算法

    1.引用计数法

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

    这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。 所谓对象之间的相互引用问题,比如:objA 和 objB互相引用,除了对象 objA 和 objB 相互引用着对方之外,这两个对象之间再无任何引用。但是他们因为互相引用对方,导致它们的引用计数器都不为 0,于是引用计数算法无法通知 GC 回收器回收他们。

    2.可达性分析算法

    2.1概念:

    这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。

    JVM 会起一个线程从所有的 GC Roots 开始往下遍历,当遍历完之后如果发现有一些对象不可到达,那么就认为这些对象已经没有用了,需要被回收。

    2.2可以作为GC Roots 的对象:

    虚拟机栈中的引用的对象
    全局的静态的对象,也就是使用了 static 关键字
    常量引用,就是使用了 static final 关键字
    本地方法栈中引用的对象

    二、判断对象生与死

    宣告一个对象死亡,至少要经历两次标记

    1、第一次标记
      如果对象进行可达性分析算法之后没发现与 GC Roots 相连的引用链,那它将会第一次标记并且进行一次筛选。

    筛选条件:判断此对象是否有必要执行 finalize () 方法。

    筛选结果:当对象没有覆盖 finalize () 方法、或者 finalize () 方法已经被 JVM 执行过,则判定为可回收对象。如果对象有必要执行 finalize () 方法,则被放入 F-Queue 队列中。稍后在 JVM 自动建立、低优先级的 Finalizer 线程(可能多个线程)中触发这个方法;

    2、第二次标记
      GC 对 F-Queue 队列中的对象进行二次标记。

    如果对象在 finalize () 方法中重新与引用链上的任何一个对象建立了关联,那么二次标记时则会将它移出 “即将回收” 集合。如果此时对象还没成功逃脱,那么只能被回收了。

    3、finalize () 方法
      finalize () 是 Object 类的一个方法、一个对象的 finalize () 方法只会被系统自动调用一次,经过 finalize () 方法逃脱死亡的对象,第二次不会再调用;

    特别说明:并不提倡在程序中调用 finalize () 来进行自救。建议忘掉 Java 程序中该方法的存在。因为它执行的时间不确定,甚至是否被执行也不确定(Java 程序的不正常退出),而且运行代价高昂,无法保证各个对象的调用顺序(甚至有不同线程中调用)。

    展开全文
  • jvm判断对象是否死亡

    2020-05-10 10:47:03
    目前主流的虚拟机均没有采用这个算法来管理内存,因为它不能解决对象循环引用的问题,比如说:对象A和B相互引用着对方,但是再没有其它引用指向它们。所以它们的引用计数器值一直为1。垃圾回收器就无法回收它们。 ...

    方法有两种:引用计数法可达性分析算法

    1. 引用计数法
            在对象中添加一个引用计数器,每有一个地方引用它,引用计时器就加一。当引用计数器为0,即没有引用指向该对象的时候,就表示对象死亡。目前主流的虚拟机均没有采用这个算法来管理内存,因为它不能解决对象循环引用的问题,比如说:对象A和B相互引用着对方,但是再没有其它引用指向它们。所以它们的引用计数器值一直为1。垃圾回收器就无法回收它们。

    2. 可达性分析算法
              算法的思想是通过一系列成为“GC Roots”的对象作为起点,从这些节点开始向下搜索,节点走过的路径成为引用链。若“GC Roots”到某一对象之间没有引用链,则证明对象是不可用的。但是不可达对象并非一定会死亡。一个对象被“宣判死刑”,至少要经过两次标记。算法中不可达的对象会进行第一次标记和一次筛选,筛选的条件时是否需要执行finalize方法,当对象没有覆盖finalize方法,或者finalize已经被虚拟机调用过,虚拟机将这两种情况视为没必要执行。
             被判为需要执行的对象将会被放入队列中进行第二次标记,除非该对象与引用链上的对象建立联系,否则将会被回收。

    展开全文
  • 1.引用计数算法(主流... 例如:objA.instance=objB以及objB.instance=objA,两个对象互相引用,这两个对象以及不可能再被访问,但是它们因为互相引用这对方,导致它们的引用计数器值都不为0,于是引用计数器算法无...

    1.引用计数算法(主流虚拟机很少用这种算法)

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

              缺点:很难解决对象之间互相循环引用的问题

              例如:objA.instance=objB以及objB.instance=objA,两个对象互相引用,这两个对象以及不可能再被访问,但是它们因为互相引用这对方,导致它们的引用计数器值都不为0,于是引用计数器算法无法通知GC收集器回收它们

    2.可达性分析算法(主流虚拟机算法)

       通过GC Roots的对象作为起始点,从这些节点开始向下检索,搜索走过的路径成为引用链,当一个对象到GC Roots没有任何引用引用链相连时,则证明此对象是不可用的。

              (图片来源网络)

    对象Object5 —Object7之间虽然彼此还有联系,但是它们到 GC Roots 是不可达的,因此它们会被判定为可回收对象。

     

    可以作为GC Roots的对象包括以下几种:

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

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

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

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

    3.finalize()方法最终回收对象

    finalize()方法,GC的一个回收对象的方法,任何一个对象的此方法都只会被系统自动调用一次。

    即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历再次标记过程。

    一次标记:

    如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法。

    当对象没有覆盖finalize()方法,或者finalize()已经被虚拟机调用过,这两种情况都视为没必要执行,在二次标记的时候不会逃脱,直接回收

    二次标记:

    如果这个对象被判定为有必要执行finalize()方法,会放在一个即将回收的集合(F-Queue),如果对象没有在finalize()重新与引用链上的任何一个对象产生联系的的话,会被二次标记,直到回收;如果产生了联系,例如把自己赋值给某个类变量或者对象的成员变量,那么次对象不被回收。

    参考书籍:《深入理解Java虚拟机》

     

     

    展开全文
  • 判断对象是否已死 引用计数算法 给对象添加一个引用计数器:一个地方引用它时,计数器值加1;引用失效时,计数器值减1. 优点:实现简单,判断效率高。 缺点:很难解决对象之间相互循环引用的问题。(相互引用对方...
  • JVM系列之对象是否存活

    万次阅读 2020-06-05 16:41:01
    前言 之前我们讲过了JVM的内存区域和内存溢出,今天我们谈下处于JVM中的对象的问题,这些对象是否存活,如何判断,又... 缺点:很难解决对象之间相互循环引用时的对象存活判断,例如对象A和B相互引用对方,即使A和B.
  • 判断对象存活,常用的方式是引用计数器:每当对象被一个地方引用,计数器便+1;当引用失效时,计数器-1。当对象的计数器为0时,该对象便是一个不被使用的对象,即“死亡”。引用计数器实现简单,效率高。然而难以...
  • 心理学家认为,判断男女两个人是否适合“牵手”,应考虑以下10个因素。  第一、彼此都是对方的好朋友,不带任何条件,喜欢与对方在一起。  第二、彼此很容易沟通、互相可以很敞开地坦白任何事情,而不必担心被...
  • 心理学家认为,判断男女两个人是否适合,应考虑以下10个因素。 第一、彼此都是对方的好朋友,不带任何条件,喜欢与对方在一起。 第二、彼此很容易沟通、互相可以很敞开地坦白任何事情,而不必担心被对方怀疑或轻视。...
  • 心理学家认为,判断男女两个人是否适合,应考虑以下10个因素。 第一、彼此都是对方的好朋友,不带任何条件,喜欢与对方在一起。 第二、彼此很容易沟通、互相可以很敞开地坦白任何事情,而不必担心被对方怀疑或轻视。 ...
  • 没有什么办法,把CourseExercise1这个对象整体加到homeworkListView里呀? 因为我一个一个属性的加 太麻烦了. 建议你用多线程吧!我用的是多线程,一点都不卡!采集还很快! 关键是我如何知道...
  • 背景:项目原本是当用户登录客户端输入正确密码后,对方就可以打网络电话过来...我在写的时候已经在最后写入了null值,在读取时也对获取的值进行判断是否为null,但仍在抛出异常。 不知道我有没表述清楚,求大神搭救
  • 1.1 引用计数法:对象中设置一个计数器,每当一个对方引用该对象时,该计数器加1,每当一个引用失效时,该计数器减1. 缺点:不能对象间解决循环y引用的问题。大多数主流的虚拟机都没有用引用计数法来判断对象...
  • 通过判断对象的引用数量来决定对象是否可以被回收 每个对象实例都一个引用计数器,被引用则+1,完成引用则-1 任何引用计数为0的对象实例可以被当作垃圾收集 优点: 执行效率高,程序执行受影响较小 缺点: ...
  • 缺点:两个对象内部相互引用了对方,当这两个对象的外部引用失效且内部引用还在引用,这是也会被判断这两个对象已死去。 2.可达性分析算法 从GC Roots的根对象为起始节点,根据引用关系向下搜索,如果过能够到达一...
  • JVM垃圾收集算法-笔记

    2019-11-12 11:15:51
    无法解决互相引用的问题(例:对象objA和对象objB都字段instance,复制objA = new objB和objB = new objA除此之外,这俩个对象再无任何调用,实际上这俩个对象已经不可能再被访问,但是他们因为互相引用对方,...
  • 52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock...
  • 判断对象是否可回收 引用计数法 概念:这种方式现在用的不多,它给对象添加一个引用计数器,每当一个地方引用了此对象,计数器就加1,当引用失效则减1。任何时候,计数器为0时,表示对象不再被引用。 特点:这个...
  • 判断对象是否需要回收两种算法。一种是引用计数算法、一种是可达性分析算法。 引用计数算法 引用计数算法很简单,它通过记录对象被引用的次数从而判断对象的重要程度。如果该对象被其他对象引用,则它的引用计数...
  • 职责链模式

    2018-04-13 09:33:09
    链上的对象逐个判断是否有能力处理该请求,如果能则就处理,如果不能,则传给链上的下一个对象。直到有一个对象处理它为止。职责链模式是行为模式。好处:​1、接受者和发送者都没有对方的明确信息,且链中的对象也...
  • // 判断双方是否连胜两局,如果连胜两局需要 break;结束 if (playerCount == 2) { System.out.println("最终玩家获胜!"); User.score++; break; ...
  • Java面经

    千次阅读 2018-10-04 16:58:58
    1. Java里面如何判断一个对象是否存活 引用计数算法 为每个对象设置一个对象引用计算器,每当地方引用到这个对象时,计数器加一,每当引用失效的时候,该计数器就自动减一。任何时刻当该对象的引用变为0的...
  • Java面经系列(一)

    2019-06-08 22:42:53
    1、Java GC时如何判断一个对象是否存活 引用计数法 基本思想:为每一个对象设置一个对象引用计算器。每当地方引用该对象时,计数器加一,每当引用失效时,该计数器自动减一。任何时刻当该对象的引用变为0时,说明...
  • jvm垃圾回收

    2015-06-27 13:00:43
    怎么判断对象是否存活呢?  只要两种算法:  1,引用计数算法,给对象中添加一个引用计数器,每当一个一个地方引用它时,计数器值+1,当引用失效,计数器-1。计数器为0时,说明对象不可能再被利用。  于是...
  • 如何判断对象是否存活? 1、引用计数算法 理解:给对象中添加一个引用计数器,每当地方引用时,计数器加1;引用失效时,计数器减1;所以任何时刻计数器为0额对象就是不可能再被使用的。 但是,Java虚拟机...
  • 1.判断对象是否可以被回收 1.1 引用计数算法 在对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一; 优点:原理简单,判定效率很高。 缺点:两个对象相互引用...
  • 垃圾收集器在对一个对象回收之前,首先要判断对象在程序中是否还有使用的可能性,充要条件就是没有被程序可访问的引用再指向这个对象实例。最简单的办法就是给对象实例添加中添加一个引用计数器,每当一个引用指向...
  • JVM 如何确定垃圾

    2019-08-09 16:05:42
    可以通过引用计数来判断一个对象是否可以回收。 2、可达性分析 为了解决引用计数法循环引用的问题(A引用B,B引用A -》循环引用 ,由于A、B彼此引用对方,导致引用计数都不为0,所以GC无法回收它们)Jav...

空空如也

空空如也

1 2 3 4 5
收藏数 88
精华内容 35
关键字:

判断对方是否有对象