精华内容
下载资源
问答
  • 实现思路:给对象添加一个引用计数器。每当有一个地方引用它时,...A引用B,B引用A——循环引用引用计数算法)由于A、B彼此引用对方,导致引用计数都不为0,所以GC无法回收它们 1 public class MyObject {...

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

      优点:实现简单,效率高。

      缺点:很难解决对象之间的相互循环引用。A引用B,B引用A ——循环引用 (引用计数算法)由于A、B彼此引用对方,导致引用计数都不为0,所以GC无法回收它们

     1 public class MyObject {
     2     public Object ref = null;
     3     public static void main(String[] args) {
     4         MyObject myObject1 = new MyObject();
     5         MyObject myObject2 = new MyObject();
     6         myObject1 = myObject2;
     7         myObject2 = myObject1;
     8         myObject1 = null;
     9         myObject2 = null;
    10     }
    11 }

    以myObject1对象为例:

      1、代码执行到line6,myObject1的引用计数为2。

      2、myObject1 = null,myObject1的引用计数为1。

      3、myObject1=0,垃圾回收器才能进行垃圾回收,myObject1 = myObject2;因为myObject1持有myObject2的引用,而要清除掉这个引用的前提条件是myObject2引用的对象被回收。而myObject2 = myObject1,最终死循环。

      4、myObject1 和myObject2均为1,导致不能进行垃圾回收。

    引用计数法的循环引用问题

    转载于:https://www.cnblogs.com/gogogofh/p/11113744.html

    展开全文
  • 循环引用实践 在学习设计模式的过程中,在观察者模式以及正在学习的状态模式,都使用了类似循环引用的方式,具体实现如下: 一种是比较经典的产生循环引用的场景; 另一种是设计模式书中经常使用的场景; 总结 我们...

    Java垃圾回收

    在学习Java的过程中,我们都知道了“Java会拾荒”,即垃圾回收:

    创建对象时,它会被存放在称为堆的内存区域,不管对象是如何创建的都会放在此区域中;

    此区域并非不同的堆;它是可以回收垃圾的堆(Garbage-Collectible Heap);

    Java会根据对象的大小来分配内存空间;

    Java会主动帮你管理内存;当某个对象被虚拟机察觉不再被使用,该对象就会被标记为可回收的;

    如果内存开始不足,垃圾收集器就会启动来清理垃圾、回收控件,让空间能够被再次利用;

    回收机制

    某个对象被虚拟机察觉不再被使用的方式有两种:

    实际就是判断对象是否是垃圾的算法;

    1-引用计数算法:

    堆中每个对象都有一个引用计数器;每有一个对象的引用,相应的引用计数+1(相反的情况则-1);

    任何引用计数为0的对象可以被当做垃圾进行收集;

    优点:执行简单、判断高效;

    缺点:难以检测出对象之间的循环引用;

    2.根搜索算法:(现在大多数JVM使用的算法)

    根集(Root Set):正在执行的Java程序可以访问的引用变量的集合(注意不是对象的集合);

    通过一些列的GC Roots对象作为起始点,寻找其他节点,找到之后继续向下寻找其他节点;

    搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链连接时,则此对象不可用;

    关于JVM:

    在目前发布的Java8中,默认的虚拟机使用的是HotSpot(另一种是JRockit),对应的垃圾回收机制也就是HotSpot的GC机制;

    而JVM HotSpot使用的就是可达性分析法,即根搜索算法;

    循环引用实践

    在学习设计模式的过程中,在观察者模式以及正在学习的状态模式,都使用了类似循环引用的方式,具体实现如下:

    一种是比较经典的产生循环引用的场景;

    另一种是设计模式书中经常使用的场景;

    14d123608b3cfb0667b8af4312bd4738.png

    总结

    我们看到:

    在将引用置null之后,主动调用垃圾回收,两个对象会调用各自的finalize()方法;

    这正与我们前文所述的根搜索算法相对应,被标记为可回收的对象,之后顺利的被垃圾收集器清理掉了;

    展开全文
  • 引用计数法 关于引用计数法,我们可以先看一段wiki上的描述: As a collection algorithm, reference counting tracks, for each object, a count of the number of references to it held by other objects. If ...

    引用计数法

    关于引用计数法,我们可以先看一段wiki上的描述:

    As a collection algorithm, reference counting tracks, for each object, a count of the number of references to it held by other objects. If an object's reference count reaches zero, the object has become inaccessible, and can be destroyed.

    When an object is destroyed, any objects referenced by that object also have their reference counts decreased.

           作为一种回收算法,引用计数法记录着每一个对象被其它对象所持有的引用数。如果一个对象的引用计数为零,那么该对象就变成了所谓的不可达对象,亦即可以被回收的。

           当一个对象被回收后,被该对象所引用的其它对象的引用计数都应该相应减少。

           而所谓的循环引用(circular referrence)有是什么意思呢?举个简单的例子:

    public class MyObject {
        public Object ref = null;
        public static void main(String[] args) {
            MyObject myObject1 = new MyObject();
            MyObject myObject2 = new MyObject();
            myObject1.ref = myObject2;
            myObject2.ref = myObject1;
            myObject1 = null;
            myObject2 = null;
        }
    }

           从上面的代码可以轻易地发现myObject1与myObject2互为引用,我们知道如果采用引用计数法,myObject1和myObject2将不能被回收,因为他们的引用计数无法为零。

    wKioL1MyZ-SDBSeHAAFo1QsAt2U761.jpg

           但是具体是为什么呢?已上图为例,当代码执行完line7时,两个对象的引用计数均为2。此时将myObject1和myObject2分别置为null,以前一个对象为例,它的引用计数将减1。若要满足垃圾回收的条件,需要清除myObject2中的ref这个引用,而要清除掉这个引用的前提条件是myObject2引用的对象被回收,可是该对象的引用计数也为1,因为myObject1.ref指向了它。以此类推,也就进入一种死循环的状态。

    可达性分析

    为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots” 对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。

    要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收

    原文链接https://blog.51cto.com/thatmonkey/1384463

    展开全文
  • 关于引用计数法循环引用问题

    千次阅读 2020-03-11 18:02:34
    现在JVM大多不采用引用计数法 进行GC,很大程度上是因为引用计数法不能解决循环引用的问题。 如下代码 public class TestClass { private Object ref; public static void main(String[] args) { TestClass o1...

    现在JVM大多不采用引用计数法 进行GC,很大程度上是因为引用计数法不能解决循环引用的问题。
    如下代码

    public class TestClass {
    
        private Object ref;
    
        public static void main(String[] args) {
    
            TestClass o1 = new TestClass(); // 1
            TestClass o2 = new TestClass(); // 2
            o1.ref = o2;					// 3
            o2.ref = o1;					// 4
            o1 = null;						// 5
            o2 = null;						// 6
        }
    }
    

    刚开始接触编程的童鞋可能不是很明白,可以看下图
    代码执行完第二行时候,对象在内存中是这样分布的
    在这里插入图片描述

    执行完第四行后是这样
    在这里插入图片描述
    执行到最后
    在这里插入图片描述
    此时对象1跟对象2的引用计数都不为0,但我们已经无法通过代码的方式来使他们的引用计数归0,这两个对象也就无法被回收。
    现在JVM大多采用 可达性分析算法分析是否回收对象。

    展开全文
  • 啥是引用计数法 顾名思义,就是当一个对象被引用的时候进行数字计数,当增加一次引用的时候计数+1,当删除一个对象的引用时-1;当一个对象的引用变成0的时候,就可以被回收了 出现的问题 请先看代码: public ...
  • 原文地址关于引用计数法,我们可以先看一段wiki上的描述:As a collection algorithm, reference counting tracks, for each object, a count of the number of references to it held by other objects. If an ...
  • 如何解决引用计数循环引用问题

    千次阅读 2020-03-28 17:06:43
    循环引用 public class MyObject { public Object ref = null; public static void main(String[] args) { MyObject myObject1 = new MyObject(); MyObject myObject2 = new MyObject(); ...
  • 引用计数方式 GC 存在循环引用问题,导致无法辨别无用对象,而 GC ROOT 方式不存在循环引用的问题 引用计数和 GC ROOT 的实现机理很易理解,面试时大家都能流利应答,那怎么才能脱颖而出呢?思考一个问题:不通过 ...
  • 概述 python采用的是引用计数为主,分代回收 和 标记清除 两种机制为辅... “引用计数法”原理:每个对象维护一个ob_ref字段,用来记录此对象被引用的次数 当有新的引用指向时,引用计数+1 当该对象的引用...
  • GC-引用计数法

    千次阅读 2019-04-08 21:16:19
    GC-引用计数法 GC:释放怎么都无法被引用的对象的机制。 引用计数法在对象的元数据区,加入了计数器,用于表示当前对象被引用了多少次。 引用计数法与其他GC算法相比,在于GC的的调用时机:GC标记-清除算法是在没有...
  • 自动引用计数循环引用(这个必须理解,必须看)注:本文详细介绍自动引用计数,以及各种循环引用问题。一网打尽!1、 自动引用计数原理Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Swift 的内存管理机制...
  • 调试发现,角色在死亡时,其引用计数retain_count居然是9。这是由引用计数混乱引起的内存泄露。 加了很多日志跟踪retain_count,又通过调试,终于确定了问题,是我错误使用CCCallFuncN这个CCAction导致的。于是...
  • 垃圾回收-- 引用计数法

    千次阅读 2019-06-29 23:35:11
    引用计数法 引用计数法,最重要的就是计数器,记录有多少引用该对象 引用计数法与mutator 的执行密切相关,在mutator 的处理过程中通过增减计数器的值来进行内存管理, 在分配和更新对象时会发生计数的变化 更新操作...
  • weak_ptr的用法以及引用计数循环

    千次阅读 2019-03-16 18:52:55
    weak_ptr对象引用资源时不会增加引用计数,但是它能够通过lock()方法来判断它所管理的资源是否被释放。另外很自然地一个问题是:既然weak_ptr不增加资源的引用计数,那么在使用weak_ptr对象的时候,资源被突然释放了...
  • 引用计数法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。 引用计数法的实现简单,判定效率也很高,在大...
  • shared维护了一个指向control block的指针,control block内部包含了智能指针对象的引用个数。weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强...
  • 、解决实例之间的循环强引用:弱引用和无主引用,弱引用和无主引用允许循环引用中的一个实例引用而另外一个实例不保持强引用。这样实例能够互相引用而不产生循环强引用 // 注意:当 ARC 设置弱引用为 nil 时 , ...
  • GC算法-引用计数法

    2020-04-05 18:37:17
    GC算法-引用计数法 概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建...
  • 引用计数法和根搜索算法 如何判断对象是否存活 引用计数法 概念 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。 首先需要声明,至少主流的Java虚拟机...
  • 深入JVM 引用计数法

    千次阅读 2019-02-21 14:42:50
    ——引用计数法   前言:给对象添加一个引用计数器,每当一个地方引用它时,计数器加1,每当引用失效时,计数器减少1.当计数器的数值为0时,也就是对象无法被引用时,表明对象不可在使用,这种方法实现简单,效率...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,392
精华内容 38,956
关键字:

引用计数法循环引用