精华内容
下载资源
问答
  • 但这个方法有个问题,就是无法解决循环引用问题。 循环引用就是对象A引用了对象B,对象B引用了对象A,构成了一个引用环。彼此都没发挥什么作用,但却不会被GC。为了解决这个问题,就有了可达性分析回收算法。 ...

    JVM有一个回收算法是引用计数算法,每当对象被引用一次,就+1,释放一个引用就-1,当垃圾回收时,引用计数为0的对象就会被GC掉。但这个方法有个问题,就是无法解决循环引用的问题。

    循环引用就是对象A引用了对象B,对象B引用了对象A,构成了一个引用环。彼此都没发挥什么作用,但却不会被GC。为了解决这个问题,就有了可达性分析回收算法。

    可达性分析:

    算法中定义了几个GC Root对象,这几个root对象在GC时不会被JVM回收掉,然后通过这些对象像树枝一样向外延伸,被引用到的对象说明还存活使用,就不会被GC,没有被这些root对象引用到的就会被GC掉。从而解决了循环引用问题。

    Root对象主要包括:

    ①系统类加载器(bootstrap)加载的类。

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

    ③JVM常量池中引用的对象。

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

    ⑤JVM本地方法栈中引用的对象。

    ⑥活动着的线程。

    官方解释:

    GC roots
    
    The so-called GC (Garbage Collector) roots are objects special for garbage collector. Garbage collector collects those objects that are not GC roots and are not accessible by references from GC roots.
    
    There are several kinds of GC roots. One object can belong to more than one kind of root. The root kinds are:
    
    Class - class loaded by system class loader. Such classes can never be unloaded. They can hold objects via static fields. Please note that classes loaded by custom class loaders are not roots, unless corresponding instances of java.lang.Class happen to be roots of other kind(s).
    Thread - live thread
    Stack Local - local variable or parameter of Java method
    JNI Local - local variable or parameter of JNI method
    JNI Global - global JNI reference
    Monitor Used - objects used as a monitor for synchronization
    Held by JVM - objects held from garbage collection by JVM for its purposes. Actually the list of such objects depends on JVM implementation. Possible known cases are: the system class loader, a few important exception classes which the JVM knows about, a few pre-allocated objects for exception handling, and custom class loaders when they are in the process of loading classes. Unfortunately, JVM provides absolutely no additional detail for such objects. Thus it is up to the analyst to decide to which case a certain "Held by JVM" belongs
     
    

    强引用:

    强引用就是引用了通过new 的方式创建的对象。在root搜索算法的里面,说的引用都指的是强引用关系。

    Object obj = new Object();
    obj这个变量引用了一个object对象,只有obj这个引用被释放了,对象才会被GC。

    比如

    obj=null;
    这样对象就会被释放。

    软引用:

    软引用的对象只有在内存不足的时候才会被回收掉,如果GC时,内存充足,那么软引用类型不会被回收。

    软引用的作用是:软引用可用来实现内存敏感的高速缓存。如果内存充足,就可以一直把缓存放在内存中,加快数据访问速度。如果内存不足了,缓存就会被回收掉。

    Object obj = new Object();
    SoftReference softReference = new SoftReference<>(obj);

    弱引用:

    弱引用只会生存很短的时间,在第一次经历GC时,无论内存是否充足,都会被回收掉。

    弱引用的作用就是:如果一个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么就可以将对象修饰为为弱引用类型。弱引用还可以用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。还有一种情况:当你想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候就可以用弱引用。

    Object obj = new Object();
    WeakReference weakReference = new WeakReference(obj);

    虚引用:

    虚引用就是假的引用,如果一个对象与虚引用关联, 则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。虚引用必须配合引用队列使用。

    虚引用的作用:因为虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时, 如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。所以程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。 如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    Object obj = new Object();
    ReferenceQueue queue = new ReferenceQueue();
    PhantomReference pf = new PhantomReference(obj,queue);

    展开全文
  • 但这个方法有个问题,就是无法解决循环引用问题。 循环引用就是对象A引用了对象B,对象B引用了对象A,构成了一个引用环。彼此都没发挥什么作用,但却不会被GC。为了解决这个问题,就有了可达性分析回收算法。 ...

    JVM有一个回收算法是引用计数算法,每当对象被引用一次,就+1,释放一个引用就-1,当垃圾回收时,引用计数为0的对象就会被GC掉。但这个方法有个问题,就是无法解决循环引用的问题。

    循环引用就是对象A引用了对象B,对象B引用了对象A,构成了一个引用环。彼此都没发挥什么作用,但却不会被GC。为了解决这个问题,就有了可达性分析回收算法。

    可达性分析:

    算法中定义了几个GC Root对象,这几个root对象在GC时不会被JVM回收掉,然后通过这些对象像树枝一样向外延伸,被引用到的对象说明还存活使用,就不会被GC,没有被这些root对象引用到的就会被GC掉。从而解决了循环引用问题。

    Root对象主要包括:

    ①系统类加载器(bootstrap)加载的类。

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

    ③JVM常量池中引用的对象。

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

    ⑤JVM本地方法栈中引用的对象。

    ⑥活动着的线程。

     

    官方解释:

    GC roots

    The so-called GC (Garbage Collector) roots are objects special for garbage collector. Garbage collector collects those objects that are not GC roots and are not accessible by references from GC roots.

    There are several kinds of GC roots. One object can belong to more than one kind of root. The root kinds are:

    • Class - class loaded by system class loader. Such classes can never be unloaded. They can hold objects via static fields. Please note that classes loaded by custom class loaders are not roots, unless corresponding instances of java.lang.Class happen to be roots of other kind(s).
    • Thread - live thread
    • Stack Local - local variable or parameter of Java method
    • JNI Local - local variable or parameter of JNI method
    • JNI Global - global JNI reference
    • Monitor Used - objects used as a monitor for synchronization
    • Held by JVM - objects held from garbage collection by JVM for its purposes. Actually the list of such objects depends on JVM implementation. Possible known cases are: the system class loader, a few important exception classes which the JVM knows about, a few pre-allocated objects for exception handling, and custom class loaders when they are in the process of loading classes. Unfortunately, JVM provides absolutely no additional detail for such objects. Thus it is up to the analyst to decide to which case a certain "Held by JVM" belongs

     

    强引用:

    强引用就是引用了通过new 的方式创建的对象。在root搜索算法的里面,说的引用都指的是强引用关系。

    Object obj = new Object();

    obj这个变量引用了一个object对象,只有obj这个引用被释放了,对象才会被GC。

    比如

    obj=null;  

    这样对象就会被释放。

     

    软引用:

    软引用的对象只有在内存不足的时候才会被回收掉,如果GC时,内存充足,那么软引用类型不会被回收。

    软引用的作用是:软引用可用来实现内存敏感的高速缓存。如果内存充足,就可以一直把缓存放在内存中,加快数据访问速度。如果内存不足了,缓存就会被回收掉。

    Object obj = new Object();
    SoftReference<Object> softReference = new SoftReference<>(obj);

     

    弱引用:

    弱引用只会生存很短的时间,在第一次经历GC时,无论内存是否充足,都会被回收掉。

    弱引用的作用就是:如果一个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么就可以将对象修饰为为弱引用类型。弱引用还可以用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。还有一种情况:当你想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候就可以用弱引用。

    Object obj = new Object();
    WeakReference<Object> weakReference = new WeakReference(obj);

     

    虚引用:

    虚引用就是假的引用,如果一个对象与虚引用关联, 则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。虚引用必须配合引用队列使用。

    虚引用的作用:因为虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时, 如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。所以程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。 如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    Object obj = new Object();
    ReferenceQueue queue = new ReferenceQueue();
    PhantomReference<Object> pf = new PhantomReference<Object>(obj,queue);

     

    展开全文
  • 最近在使用NSTimer添加到Runloop时,发现引用Timer的View和Controller无法正常释放,即不会调用View或者Controller的...今天偶然看到YYKit的作者写的YYWeakProxy,说是用于解决循环引用问题,于是,试了下,发现Tim...

    最近在使用NSTimer添加到Runloop发现引用Timer的View和Controller无法正常释放,即不会调用View或者Controller的dealloc方法。这是因为timer在添加target时,timer持有target,而target本身又持有timer,导致循环引用。

    今天偶然看到YYKit的作者写的YYWeakProxy,说是用于解决循环引用问题,于是,试了下,发现Timer真的可以释放了:


    查了下资料,发现NSProxy真的是一个神奇又少见的类,其关键原理就是消息转发(Message Forward),可以参考这篇文章,描述的比较形象易懂:NSProxy——少见却神奇的类

    更多的资料:

    官方示例

    协议和 NSProxy 实现多继承

    YYWeakProxy


    展开全文
  • 今天小编就为大家分享一篇vue 解决循环引用组件报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 主要介绍了vue如何解决循环引用组件报错的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • ❝引用计数方式 GC 存在循环引用问题,导致无法辨别无用对象,而 GC ROOT 方式不存在循环引用的问题❞引用计数和 GC ROOT 的实现机理很易理解,面试时大家都能流利应答,那怎么...

    引用计数方式 GC 存在循环引用问题,导致无法辨别无用对象,而 GC ROOT 方式不存在循环引用的问题

    引用计数和 GC ROOT 的实现机理很易理解,面试时大家都能流利应答,那怎么才能脱颖而出呢?思考一个问题:「不通过 GC ROOT,仍使用引用计数方式,怎么解决它的循环引用问题?」

    解答此问题前,通过目标驱动法来想象一下,若 Get 了此知识点,可以这样应用到面试中:

    面试官: 说一下垃圾回收机制吧

    我: ...可以通过强、弱引用计数结合方式解决引用计数的循环引用问题,实际上 Android 的「智能指针」就是这样实现的...

    智能指针

    智能指针在整个 Android 工程中使用很广泛,在 binder 相关源码可以看到 sp、wp 类型的引用:

     sp<IBinder> result = new BpBinder(handle);
    
     wp<IBinder> result = new BpBinder(handle);
    

    sp 即 strong pointer 强指针引用;wp 是 weak pointer 弱指针引用。

    在 Java 中我们不用关心对象的销毁及内存释放,GC 机制会自动辨别回收无用对象,而 「智能指针」 就是 native 层一个小型的 GC 实现。

    智能指针以引用计数的方式来标识无用对象,使用智能指针的对象需继承自 RefBase,RefBase 中维护了此对象的强引用数量和弱引用数量。

    强指针 sp 重载了 "=" 运算符,在引用其他对象时将强引用计数 +1,在 sp 析构函数中将强引用计数 -1,当强引用计数减至 0 时销毁引用的对象,这样就实现了对象的自动释放。

    弱指针引用其他对象时将弱引用计数 +1,在 wp 析构函数中将弱引用计数 -1,当强引用计数为 0 时,不论弱引用计数是否为 0 都销毁引用的对象。

    如何解决循环引用问题

    只靠强引用计数方式,会存在循环引用的问题,导致对象永远无法被释放,弱引用就是专门用来解决循环引用问题的:

    「若 A 强引用了 B,那 B 引用 A 时就需使用弱引用,当判断是否为无用对象时仅考虑强引用计数是否为 0,不关心弱引用计数的数量」

    这样就解决了循环引用导致对象无法释放的问题,但这会引发野指针问题:当 B 要通过弱指针访问 A 时,A 可能已经被销毁了,那指向 A 的这个弱指针就变成野指针了。在这种情况下,就表示 A 确实已经不存在了,需要进行重新创建等其他操作

    智能指针自定义规则

    智能指针并不是固定的 "当强引用计数为 0 时,不论弱引用计数是否为 0 都销毁引用的对象" ,而是可以自定义规则。RefBase 提供了 extendObjectLifetime() 方法,可以用来设置引用计数器的规则,不同规则对删除目标对象的时机判断也是不一样的,包括以下三种规则:

    OBJECT_LIFETIME_STRONG:只有在这个对象内存空间中的强计数器值为 0 的时候才会销毁对象

    OBJECT_LIFETIME_WEAK:只有在这个对象内存空间中的强计数器和弱计数器的值都为 0 的时候才会销毁对象

    OBJECT_LIFETIME_MASK:不管这两个计数器是不是都为 0,都不销毁对象,即与一般指针无异,还是要自己手动去释放对象

    推荐阅读
    你亲手写的代码,正在出卖你
    深夜,聊聊架构设计
    
    深夜,分享一个Git小技巧
    
    编程·思维·职场
    欢迎扫码关注
    
    
    展开全文
  • 主要给大家介绍了关于iOS如何巧妙解决NSTimer的循环引用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
  • 只要不是构造函数注入就不会产生循环引用问题。 这是因为: spring 容器对构造函数配置Bean 进行实例化的时候,有一个前提,即 Bean 构造函数入参引用的对象必须已经准备就绪。 由于这个机...
  • 在python中常常会遇到循环import即circular import的问题,下面这篇文章主要给大家介绍了关于Python中循环引用(import)失败的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起学习...
  • 2、需要解决拷贝对象内的循环引用问题(使用数组记录拷贝过的对象,记录一个拷贝对象的数据结构,{source:原拷贝对象,target:拷贝后的对象}) 3、使用递归的方式可能会造成爆栈,解决办法就是采用迭代的方式 递归...
  • 关于引用计数法的循环引用问题

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

    千次阅读 2017-07-26 17:16:06
    如何处理循环引用问题? 什么是循环引用?顾名思义,两个对象之间形成环路。对于C++中两个对象来讲,使用智能指针解决不了这个问题。因为其引用计数不为0。循环引用解决办法循环引用涉及的问题是垃圾回收(Garbage ...
  • 引用计数法的循环引用问题

    千次阅读 2018-10-15 17:13:20
    关于引用计数法,我们可以先看一段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...
  • C++ 智能指针的循环引用问题

    千次阅读 2019-03-21 21:43:57
    首先我们要知道,循环引用问题是shared_ptr智能指针引起的。shared_ptr的一个最大的陷阱是循环引用,循环引用会导致堆内存无法正确释放,导致内存泄漏。 那么shared_ptr是如何引起循环引用的呢? 先明确一个结论:...
  • Swift 解决循环引用问题

    千次阅读 2017-03-20 16:25:25
    虽然Swift和Objective-C一样,默认也是基于ARC进行内存管理的,虽然如此,但如果不注意任然会出现循环引用问题,导致内存泄露。Objective-C 在使用block时解决循环引用可以使用 __block 或者 __weak 修饰对象,那么在...
  • 当一个对象呗创建或者被引用时,该对象的引用计数就会加1,当对象被销毁时相应的引用计数就会减1,一旦引用计数减为0时,表示该对象已经没有被使用.可以将其所占用的内存资源释放掉. a =[]#对象A的引用计数为 1 b =[]#...
  • 本篇文章主要介绍了在springmvc中解决FastJson循环引用问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 循环引用的示例: public class test{ public static void main(String[]args){ A a = new A(); B b = new B(); a=null; b=null; } } class A { public B b; } class B { ...
  • 如何解决引用计数的循环引用问题

    千次阅读 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(); ...
  • 本文的内容是讲述,如何解决循环引用带来的内存问题。  背景:智能指针采用Boost库,语言C++,开发工具VS2005,示例程序为Win32程序。  循环引用示例 #include "stdafx.h" #include #include #include ...
  • 解决flask循环引用问题

    千次阅读 2019-03-22 08:55:24
    刚开始结构是这样的 app  - init.py  - models.py init.py是这样的 ` from flask import Flask from flask-sqlalchemy ...但这就导致了循环引用问题。...这样就解决了flask循环引用问题
  • 内容: c++11后,我们有了新的智能指针可以使用,我们可以抛弃auto,而使用新的智能指针,其中shared_ptr指针在正常使用是没有问题的,但是如果shared_ptr出现互相引用的时候,那么就会出现循环引用,从而导致资源...
  • • 1:为什么要使用智能指针 我们知道C++的内存管理是让很多人头疼的事情,当我们写一个new语句时,一般就会立即把delete语句...使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作...
  • 小记 TypeScript 中的循环引用问题

    千次阅读 2020-10-09 19:43:24
    随着项目规模的不断增长,循环引用问题似乎总是不可避免,本文就 TypeScript 中可能出现的循环引用问题做了一些简单记录~ 平时编写 TypeScript 代码时,一般都倾向于使用模块(Module),通过结合使用 import 和 export ...
  • 本篇文章主要介绍了iOS NSTimer循环引用的几种解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 本文通过文字说明加代码的形式给大家介绍了iOS MRC 下 block 循环引用问题,非常不错,具有参考借鉴价值,需要的朋友参考下吧
  • 网上一个例子: ...原本设定的方法是这两个包里的函数互相调用,那么我们通过代码来看下怎么解决相应的问题。 首先是rockettest.go,这里调用了ciconnector.go中的Test方法,代码如下 package main import...
  • 最后将map 当做一颗树 ,map如果带classInfo 就将他转化成classInfo的类,如果map里面还有map同理,层层递归 当然要考虑对象循环引用不能死递归的问题: 如果这个map已经被转成对象 那么他会被记在map里key是map value...
  • shared_ptr 的问题
  • 使用weak_ptr解决循环引用的方法 #include #include #include using namespace std ; template < class T> class Node { public : Node(T num) :value(num) { } ~Node() { cout "~...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 307,620
精华内容 123,048
关键字:

如何解决循环引用的问题