`

关于SoftReference与WeakReference的理解

JVM 
阅读更多
        正常来说,传统的JAVA引用,如
public void doSomeThing(){
    User user = new User();
    ...
}


       当方法doSomeThing方法结束时,对象user的引用丢失,其所占的空间将由JVM在下次垃圾回收时收回。如果我们将user对象的引用保存在一个全局的HashMap中,如
Map map = new HashMap();
public void doSomeThing(){
    User user = new User();
    map.put("user",user);
}


        此时,user对象由于在map中保存了引用,只要这个引用存在,那么JVM永远也不会收回user对象所占用的内存。
         这样的内存管理机制相信大家都耳熟能详了,在绝大多数情况下,这种解决方案都是非常完美的。但在某些情况下,却有些不便。好比如对于缓存而言,当user对象使用之后,我们希望保留其引用以供下次需要的时候可以重复使用,但又不希望其引用一直存在,如果那样,随着时间的推移,有限的空间将会被这些数据消耗殆尽。最好的方式莫过于一种方式,可以在对象没有被垃圾回收器回收之前依然可以访问,当垃圾回收器启动时,如果此对象没有其它对象引用,则按常规对其进行回收。
         SoftReference,WeakReference与PhantomReference为上面的思路提供了有力支持。
         这三种类型的引用属于“非持续性引用”,也就是说,这种引用关系并非持续存在,它们所代表的引用的生命周期与JVM的运行密切相关,而并非传统意义上的引用一样依赖于编码阶段的预先规划。
        SoftReference的例子:
SoftReference ref;
public void doSomeThing(){
User user = new User();
ref = new SoftReference(user);
}
public void doAnotherThing(){
User user = (User)ref.get();//通过SoftReference获得对象引用
System.out.println(user.getName());
}

        假设我们先执行了doSomeThing方法,产生了一个User对象,并为其创建了一个SoftReference引用。之后的某个时刻,我们调用了doAnotherThing方法,并通过SoftReference获取User对象的引用。此时我们是否还能取得user对象的引用?这要看JVM的运行情况。对于SoftReference而言,只有当目前内存不足的情况下,JVM在垃圾回收时才会收回其包含的引用(JVM并不是只有在内存不足的情况下才会启动垃圾回收器,具体什么时候启动得看具体版本JVM的垃圾回收策略)。这里可能出现两种情况
  • JVM目前还未出现过因内存不足所引起的垃圾回收,user对象的引用可以通过SoftReference从JVM Heap中收回。
  • JVM已经因为内存不足启动了垃圾回收机制,SoftReference所包含的user对象的引用被JVM所废弃。此时ref.get方法将返回一个空引用(null),对于上面的代码而言,也就意味着这里可能抛出一个NullPointerException。


       WeakReference比SoftReference在引用的维持性上来看更加微弱。无需等到内存不足的情况,只要JVM启动了垃圾回收机制,那么WeakReference所对应的对象就将被JVM回收。也就是说,相对SoftReference而言,WeakReference被JVM回收的概率更大。
       
        PhantomReference 比WeakReference 的引用维持性更弱。与WeakReference 和SoftReference不同,PhantomReference所引用的对象几乎无法被回收重用。它指向的对象实际上已经被JVM销毁(finalize方法已经被执行),只是暂时还没被垃圾回收器收回而已。PhantomReference主要用于辅助对象的销毁过程,在实际应用层研发中,几乎不会涉及。
分享到:
评论

相关推荐

    SoftReference、WeakReference和PhantomRefrence分析和比较

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

    StrongReference,SoftReference, WeakReference的使用实例

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

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

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

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

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

    redis基础.rar

    周期无法控制可以采用SoftReference,WeakReference,PhantomReference这三种对象来执行(看了Ibatis的缓存机制才发现JDK居然还提供了PhantomReference这玩意儿,得恶补基础啊),这三种都是弱引用,区别在于强度...

    软引用SoftReference1

    软引用SoftReference1

    软引用SoftReference缓存图片及异步加载

    通过软引用SoftReference缓存图片及实现图片的异步加载

    Java中内存泄露及垃圾回收机制参照.pdf

    4. 使用WeakReference和SoftReference,WeakReference和SoftReference可以帮助避免内存泄漏。 Java的垃圾回收机制可以自动回收内存中的垃圾,避免内存泄漏,但是程序员需要注意避免内存泄漏的几点,以确保程序的...

    Android基于SoftReference缓存图片的方法

    本文实例讲述了Android基于SoftReference缓存图片的方法。分享给大家供大家参考,具体如下: Java中的SoftReference即对象的软引用。如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间...

    不加密Google Guava视频教程.txt

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

    强,软,弱,虚引用非常通俗易懂的代码理解

    网上关于四种引用长篇概论很多,不过大多是理论,看是看懂了可能就是一头雾水,下面我用很简单的代码帮助你加强理解和记忆。 前述:除了强引用外,其他引用不是我们所常见的 new出来的对象,而是需要借用3个类...

    java 常见的四种引用

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

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

    软引用(SoftReference) 23 弱引用(WeakReference) 23 虚引用(PhantomReference) 24 【基础】final, finally, finalize的区别 24 【基础】Java 中定义常量的几种方法 25 【基础】什么时候使用字节流?什么时候...

    Java虚拟机(四)——Java引用对象4种类型

    他们分别是强引用(StrongReference),软引用(SoftReference),弱引用(WeakReference)以及PhantomReference(虚引用),他们被 GC回收的可能性从小到大排列。 强引用(StrongReference) 只要强引用存在,垃圾回收器将...

    Android异步加载图片Demo

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

    软应用示例

    解决android OOM的SoftReference

    android中软引用的使用测试

    所以开始做应用的时候并没有考虑这些,所以后来痛苦了好久,现在和大家分享一些关于让你的程序稳定程度加一成保障的做法,那就是在程序中SoftReference的使用,可能大家并没有确切的去做过这个软引用的实际使用与不...

    Android实现ListView异步加载图片

    SoftReference 是一种软引用的机制,用于缓存对象,避免对象被垃圾回收器回收。使用 SoftReference 可以避免图片重复加载,提高应用程序的性能。 3. 异步加载图片的实现 要实现异步加载图片,我们需要使用 Thread ...

Global site tag (gtag.js) - Google Analytics