`

WeakReference

阅读更多
WeakReference


一、总结

1.jdk 1.8.0

2.定义
用来描述非必须的对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发送之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。一旦一个弱引用对象被垃圾回收器回收,便会加入到一个注册引用队列中。

3.
存活周期,第一次GC后到第二次GC前,第二次GC时被回收。
如果使用带有引用队列的构造方法,GC回收时弱引用被放入引用队列。

4.应用
WeakHashMap

二、源码分析

/**
 * Weak reference objects, which do not prevent their referents from being
 * made finalizable, finalized, and then reclaimed.  Weak references are most
 * often used to implement canonicalizing mappings.
 *
 * <p> Suppose that the garbage collector determines at a certain point in time
 * that an object is <a href="package-summary.html#reachability">weakly
 * reachable</a>.  At that time it will atomically clear all weak references to
 * that object and all weak references to any other weakly-reachable objects
 * from which that object is reachable through a chain of strong and soft
 * references.  At the same time it will declare all of the formerly
 * weakly-reachable objects to be finalizable.  At the same time or at some
 * later time it will enqueue those newly-cleared weak references that are
 * registered with reference queues.
 *
 * @version  1.19, 11/17/05
 * @author   Mark Reinhold
 * @since    1.2
 */

public class WeakReference<T> extends Reference<T> {

  • 弱引用对象,指的是不能防止他们的参照物对象终结、完成、再生
  • 弱引用通常是用来实现规范映射
  • 假设GC垃圾回收器在某一个时间点确认一个对象是弱可达,这时GC将会自动清除所有指向该对象的弱引用以及由强引用、软引用所链接的对象中出现的弱引用,同时GC将生命原来的所有的弱可达对象是终结的。同时或过一段时间会将新的弱引用对象放入引用队列中。



    /**
     * Creates a new weak reference that refers to the given object.  The new
     * reference is not registered with any queue.
     *
     * @param referent object the new weak reference will refer to
     */
    public WeakReference(T referent) {
	              super(referent);
    }


  • 对给定的对象创建弱引用对象,新的引用没有放入任何队列中


    /**
     * Creates a new weak reference that refers to the given object and is
     * registered with the given queue.
     *
     * @param referent object the new weak reference will refer to
     * @param q the queue with which the reference is to be registered,
     *          or <tt>null</tt> if registration is not required
     */
    public WeakReference(T referent, ReferenceQueue<? super T> q) {
	                                        super(referent, q);
    }



  • 对给定的对象创建弱引用对象,新的引用放入给定的队列中


三、弱引用

1.举例
// a 是 A 的强引用
A a = new A(); 
// b 对 a 的依赖
B b = new B(a);
// a 的引用指向 null 等待GC回收,但b持有对a的依赖,GC不能回收 a 对象
// 因为不能及时回收此类对象,可能造成内存泄漏
a = null ;
// 解决方案
b = null ; // 设置 a 的引用依赖为 null 
// 手动设置其引用依赖为NULL来解决 GC 回收的问题,违反了 GC 自动进行垃圾回收的理念

// 引入弱引用, B 继承 WeakRefence 
WeakRefence<A> wr = new WeakRefence<A>(a);
// 那么当 a = null 时,虽然依然被 b 引用依赖,但GC 依然可能回收此块的内存 


2.弱引用
当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回收
对象只能生存到下一次垃圾收集之前。在垃圾收集器工作时,无论内存是否足够都会回收掉只被弱引用关联的对象。
博文参考:

谈谈java中的WeakReference



分享到:
评论

相关推荐

    SoftReference、WeakReference和PhantomRefrence分析和比较

    SoftReference、WeakReference和PhantomReference分析和比较 在 Java 中,引用类型分为强引用、软引用、弱引用和虚引用四种。强引用是我们最常用的引用类型,而软引用、弱引用和虚引用则是 Java 为我们提供的三种...

    WeakDelegate,Weakreference财产委托提议.zip

    在IT行业中,尤其是在Android或Java开发中,弱引用(WeakReference)是一个重要的概念,它用于内存管理,防止内存泄漏。这个“WeakDelegate,Weakreference财产委托提议.zip”项目显然是一个Kotlin实现的开源项目,旨在...

    Java引用总结--StrongReference、SoftReference、WeakReference、PhantomRef

    Java从1.2版本开始引入了四种引用,分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。这四种引用的级别由高到低依次为:强引用 &gt; 软引用 &gt; 弱引用...

    WeakReference(弱引用)让GC需要时回收对象

    WeakReference wref = new WeakReference(obj); // 创建一个弱引用指向该对象 obj = null; // 断开原对象的强引用 // 检查对象是否已被回收,并尝试重新获得强引用 Object obj2 = wref.Target; if (obj2 != null) ...

    详解Java弱引用(WeakReference)的理解与使用

    Java 弱引用(WeakReference)的理解与使用 Java 中的弱引用(WeakReference)是一种特殊的引用类型,它可以帮助我们更好地管理内存和避免内存泄漏。在 Java 中,当一个对象被创建时,它被放在堆(Heap)中。当垃圾...

    StrongReference,SoftReference, WeakReference的使用实例

    StrongReference,SoftReference, WeakReference的使用实例,请参照博客:http://blog.csdn.net/To_be_Designer/article/details/72673421

    WPF MVVM视图绑定到单例和WeakReference

    在这个场景中,标题“WPF MVVM视图绑定到单例和WeakReference”涉及到两个关键概念:单例模式和弱引用。 首先,单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。在C#中,我们通常通过静态方法...

    AsyncTask_WeakReference

    `WeakReference`是Java和Kotlin中处理引用的一种机制,它可以帮助我们防止内存泄漏。在`AsyncTask`与`WeakReference`结合使用时,可以确保当Activity或Fragment被销毁时,相关任务不会因为强引用而继续存在,从而...

    android大位图二次采样处理三

    3. 使用软引用或弱引用:通过SoftReference或WeakReference持有Bitmap对象,帮助垃圾回收器更好地管理内存。 总结,大位图的二次采样处理是Android开发中解决内存问题的关键技术。开发者需要理解其原理,掌握计算...

    weakref-allocation:在您的应用程序中公开 WeakReference 使用

    这是对 java.lang.ref.WeakReference 实现的修改,它将通过 JMX MBean 跟踪和报告它发现的内容。如何使用: 在您的应用程序中启用 JMX。 然后使用指向此实现的引导类路径启动 Java 应用程序。 例如: $ java -...

    安卓面试题

    - **解决方案**:使用WeakReference替代强引用。 #### 15. 接口与抽象类的区别 - **接口**:只能定义方法签名,不能有方法体。 - **抽象类**:可以有抽象方法也可以有具体实现的方法。 #### 16. String、...

    简单缓存Cache介绍

    private Dictionary, WeakReference&gt; Buffer = new Dictionary, WeakReference&gt;(); public object this[string key] { get { WeakReference ret; if (Buffer.TryGetValue(key, out ret) && ret.IsAlive) ...

    深入探讨 java.lang.ref 包1

    本文将深入探讨这个包中的四种主要引用类型:StrongReference、SoftReference、WeakReference 和 PhantomReference,以及它们的特性、用法和作用。 首先,强引用(StrongReference)是我们在日常编程中最常见的引用...

    深入探讨 java-lang-ref 包.docx

    WeakReference&lt;Bean&gt; beanRef = new WeakReference(new Bean("name", 10)); System.out.println(beanRef.get()); // “name:10” PhantomReference 是最弱的一种引用类型,它并不直接指向对象,而是指向对象的引用...

    Android处理内存泄漏的代码例子

    WeakReference&lt;Activity&gt; weakActivity = new WeakReference(activity); // 使用weakActivity.get()访问Activity // 当不再需要时,弱引用不会阻止Activity被回收 weakActivity.clear(); ``` 在ExmLeak这个压缩包...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    例如,创建一个处理消息的静态内部类`MyHandler`,并在其中使用`WeakReference`持有`Activity`的引用: ```java public class MyActivity extends AppCompatActivity { private static class MyHandler extends ...

    HandlerDemo.7z

    在这段代码中,`weakRef`使用`WeakReference`包装`Activity`,确保即使`Handler`有未处理的消息,`Activity`也能正常被回收。 综上所述,`HandlerDemo.7z`可能包含了一个演示了`Handler`使用、计时器功能以及弱...

Global site tag (gtag.js) - Google Analytics