`
mmdev
  • 浏览: 12932744 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Java WeakReference 和 SoftReference .

 
阅读更多

在python的标准类库中发现有weakref这个模块,比较有趣。依稀想起在java中似乎也有个叫做WeakReference的类,只是当时没有太留心,此时好奇心起,在网上找到这篇文章,讲的挺好,摘要一下。

在Java 1.2中就引入了java.lang.ref这个包,WeakReference就属于这个包。WeakReference是干嘛的呢,一言弊之,它是和Java中的垃圾回收相关的。如果一个对象只有WeakReference引用它,那么这个对象就可能被垃圾回收器回收。

在什么场合下应用WeakReference呢?

有时我们会碰到一些不能继承的类,如final class, 或者通过Factory创建的对象,它对外只暴露一个接口,我们无法知道它的具体实现类,自然也无法继承它。假如我们要使用一个Widget类,因为某种 缘故,我们无法继承该类来加入某个功能。但是,我们必须将每个Widget对象和某个序列号关联,而Widget本身没有serial number这个属性,这时该怎么做呢?

你也许已经想到,用HashMap!对,像这样:

1.serialNumberMap.put(widget, widgetSerialNumber);


这看起来工作的很好。但是,有个问题:当我们不再需要某个Widget的serial number信息,此时应该从HashMap中将这个Entry移除,如果我们忘记了怎么办?因为HashMap中持有对这个对象的引用,这个对象永远不 会被垃圾回收器回收,这就造成了内存泄漏!这意味着我们需要像没有垃圾回收功能的语言一样,手动管理内存!但是我们用的是Java.....

另一个很常见的问题是缓存。如果使用强引用,那么我们缓存的对象就会一直滞留在内存中,不会被回收,除非我们手动的将其从缓存中移除。此外,这还需要我们决定何时从缓存中移除对象,又一个手动管理内存的问题!

此时,WeakReference就显示出它的价值了。如何创建一个WeakReference呢?很简单:

1.WeakReference<widget> weakWidget = newWeakReference<widget>(widget);
2.Widget w = weakWidget.get();


要注意的是,当调用weakReference.get()可能返回null(意味着指向的对象已经被回收)。其实,对于Widget serial number这个问题,最简单的方法是使用WeakHashMap,它的使用和普通的HashMap完全一样,不同点在于,WeakHashMap的key被实现为一种WeakReference(注意,是key而不是value),当key对象被回收后,WeakHashMap会自动将对应的entry移除。更精确的说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的回收。

Java中有四种类型的引用,按照强弱关系依次为:Strong Reference>Soft Reference>WeakReference> Phantom Reference。

其中,我们平常用的就是Strong Reference,而Phantom Reference很少用到,因此这里不去研究了,那么什么是Soft Reference呢?

Soft Reference和weak reference的区别是:一旦gc发现对象是weak reference可达就会把它放到ReferenceQueue中,然后等下次gc时回收它;当对象是Soft reference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,当实在没辙了才回收它。像cache系统,最适合用Soft reference。让gc来替我们决定什么时候回收对象以及回收哪些对象。

分享到:
评论

相关推荐

    SoftReference、WeakReference和PhantomRefrence分析和比较

    SoftReference、WeakReference和PhantomRefrence分析和比较

    java 常见的四种引用

    1.强引用1.强引用 2.软引用(SoftReference) 3.弱引用(WeakReference) 4.虚引用(PhantomReference) 等等;

    WeakDelegate,Weakreference财产委托提议.zip

    这个项目为万能的(有时是可怕的)弱引用实现了一个kotlin包装器,以便您可以更友好地使用它们。

    StrongReference,SoftReference, WeakReference的使用实例

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

    资讯阅读,通过CBReader

    import java.lang.ref.WeakReference; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; ...

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

    3.1 强引 3.2 软引 3.3 弱引 3. 4 假象引

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

    主要介绍了Java弱引用(WeakReference)的理解与使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    ibatis2.x 详细介绍

    MEMORY 类型Cache 与WeakReference ........................................ 40 LRU 型Cache ....................................................................................... 42 FIFO 型Cache ........

    ibatis开发指南中文版

    MEMORY类型Cache与WeakReference ........................................40 LRU型Cache .......................................................................................42 FIFO型Cache ................

    不加密Google Guava视频教程.txt

    ├─Google Guava 第29讲-SoftReference,WeakReference,PhantomReference精讲.wmv ├─Google Guava 第30讲-SoftReference加LRU算法实现InMemoryCache.wmv ├─Google Guava 第31讲-Guava之CacheLoader,...

    ibatis开发指南_夏昕

    MEMORY类型Cache与WeakReference ........................................40 LRU型Cache .......................................................................................42 FIFO型Cache ................

    ibatis入门教程

    MEMORY 类型Cache 与WeakReference ........................................ 40 LRU 型Cache ....................................................................................... 42 FIFO 型Cache ........

    Android异步加载图片Demo

    该Demo主要原理: 加载图片时先查看缓存中时候存在该图片,如果存在则返回该图片,否则先加载载一个...并且处理的多个细节,包括使用WeakReference、SoftReference防止内存溢出、解决使用Handler时context泄露问题 登

    ibatis 开发指南(pdf)

    %m%n log4j.logger.java.sql.PreparedStatement=DEBUG 构建ibatis 基础代码 ibatis 基础代码包括: 1. ibatis 实例配置 一个典型的配置文件如下(具体配置项目的含义见后): &lt;?xml version=...

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

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

    拓胜技术专家教你如何深入理解Java四种引用类型

    ava有四种引用类型,strongreference,softreference,weakreference,phantomreference。本篇文档主要的就是进阶的介绍和了解这四种引用类型的异同点,助于你对java的更好的学习理解

    从面试题中看java的Reference(引用)

     A:通过WeakReference构造出的,不再有强引用…  Q:那软引用呢,这些引用间的区别是什么?  A:…  面到这个阶段这比较尴尬了。为了避免类似的尴尬,特地花了点时间去整理这些引用,以便下次面试的时候这...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制? 30 【基础】Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? 30 【基础】Java 中的final关键字有哪些用法?...

    AsyncTask_WeakReference

    AsyncTask_WeakReference

Global site tag (gtag.js) - Google Analytics