`
trinityblood
  • 浏览: 116755 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java SoftReference

    博客分类:
  • Java
阅读更多
SoftReference的语义就是当内存不够用的时候,GC会回收SoftReference所引用的对象。所以,在memory sensitive的程序中将某些大型数据设置成SoftReference再合适不过了。


创建一个SoftReference:

Object obj = new Object();
SoftReference softRef = new SoftReference(obj);
obj = null; 

最后那句“obj = null”很重要。如果不将obj设置成null,那么new出来的Object就会有一个"strong reference",如果这样,softRef就不能发挥作用了。


使用SoftReferene:

Object obj2;
obj2 = sr.get();
if (obj2 == null) // GC freed this
sr = new SoftReference(obj2 = new Object()); 

因为是SoftReference,所以有可能已经被GC回收了,所以需要判断sr.get()的返回值是否为null。如果是的话,就再重新new一个Object。这里的最后一行代码也很有讲究,比如,也许会这么写:
Object obj2;
obj2 = sr.get();
if (obj2 == null) {
sr = new SoftReference(new Object());
obj2 = sr.get();
} 

这样的问题就在于GC可能发生在"sr = new SoftReference(new Object());"和"obj2 = sr.get()"之间,那么obj2仍然有可能为null。

文章出处 http://blog.csdn.net/historyasamirror/article/details/6076505
分享到:
评论

相关推荐

    深入探讨 java.lang.ref 包1

    Java.lang.ref 包是 Java 类库中的一个重要组成部分,它包含了与垃圾回收机制密切相关的引用类。这些引用类的设计允许开发者在特定条件下控制对象的生命周期,尤其是在处理缓存、大型数据结构或者避免内存泄漏时显得...

    Java引用类型1

    SoftReference<String> softRef = new SoftReference(new String("Soft")); ``` - `WeakHashMap`是使用软引用作为键的一个例子,即使键的对象在其他地方仍被引用,只要内存压力增大,键对象也会被回收。 3. **弱...

    Java 引用1

    在`java.lang.ref`包中,有三个类分别对应这四种引用:`SoftReference`、`WeakReference`和`PhantomReference`。此外,`ReferenceQueue`用于存储被回收引用的实例,以便开发者可以监控对象的回收状态。 在实际应用...

    Java中的强软弱虚引用

    SoftReference<Object> softRef = new SoftReference(new Object()); ``` 软引用通常用于实现内存敏感的缓存技术。例如,当应用程序加载图像或大型数据结构时,可以使用软引用将这些数据缓存起来。当内存紧张时,...

    软应用示例

    本篇将详细讲解如何利用软引用(SoftReference)来解决Android OOM问题,并探讨其工作原理以及在实际应用中的注意事项。 **软引用(SoftReference)的概念** 软引用是Java内存模型中的一种特殊引用类型,它介于强...

    SoftReference、WeakReference和PhantomRefrence分析和比较

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

    浅谈Java中的四种引用方式的区别

    Java使用`java.lang.ref.SoftReference`类来表示软引用。 - 当内存空间不足时,JVM会回收软引用关联的对象,以防止`OutOfMemoryError`的发生。软引用常用于实现缓存,如网页缓存和图片缓存,以便在内存紧张时自动...

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

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

    strong-soft-weak:各种Java参考的示例

    SoftReference<String> softRef = new SoftReference(new String("Soft Reference")); ``` 然后是“弱引用”。与软引用相比,弱引用的对象在下一次垃圾收集时就会被回收,无论系统内存是否充足。弱引用通常用于创建...

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

    本篇文章将深入探讨如何使用Java中的软引用(SoftReference)来缓存图片,并结合异步加载策略来实现高效的图片加载机制。 一、软引用(SoftReference)的概念与作用 软引用是Java内存管理中的一种特性,它是一种弱...

    Android基于SoftReference缓存图片的方法

    Java中的SoftReference即对象的软引用。如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用...

    Android利用软引用和弱引用避免OOM的方法

    软引用由`java.lang.ref.SoftReference`类表示。 - 软引用常用于缓存策略,以在内存紧张时释放缓存对象,但不立即导致应用崩溃。 3. **弱引用(Weak Reference)** - 弱引用比软引用更“弱”,只要垃圾回收器扫描...

    java之反射优化(缓存思路)源码

    2. **软引用**:使用Java的`SoftReference`可以创建一个弱化的缓存,这样在内存紧张时,JVM会自动回收这些不再使用的反射对象,以释放内存。 ```java public class ReflectionUtil { private static Map, ...

    java类包的介绍与使用

    `java.lang.ref` 提供了与垃圾收集器交互的引用对象类,如 `WeakReference`, `SoftReference`。 `java.lang.reflect` 允许程序在运行时检查类和对象的结构。 `java.math` 包提供高精度的数学运算,如 `BigInteger`...

    很容易弄错的java面试题

    面试官可能会让你解释 finalize() 方法的作用,以及何时应该使用 WeakReference 或 SoftReference。 7. **接口与抽象类**:两者之间的选择,以及Java 8引入的默认方法(default methods)如何改变这一格局。接口...

    Java实现LRU算法.zip

    在实际应用中,LRU算法不仅可以用于操作系统中的页面替换,还可以应用于数据库查询缓存、编程语言的内存管理(如Java的SoftReference和WeakReference)以及Web服务器的静态资源缓存等场景。 总的来说,Java实现LRU...

    Java内存泄露及内存无法回收解决方案

    3. 使用弱引用和软引用:在某些场景下,可以使用WeakReference或SoftReference,让对象在需要时可以被GC回收。 4. 优化单例模式:确保单例对象在不再需要时能被正确清理。 5. 限制静态集合类大小:避免无限增长的...

    java课程代码

    3. **Java_04_Ref**:这部分可能涉及到Java中的引用类型,如软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。这些引用类型用于内存管理,帮助开发者避免内存泄漏,尤其是在大内存...

    《Effective Java》读书分享.pptx

    消除过期引用可以使用多种方法,例如,使用 WeakReference 或 SoftReference,或者使用 finalize() 方法来回收对象。 其他知识点 其他知识点还包括泛型、枚举和注解、Lambda 和 Stream、方法、通用编程、异常、...

Global site tag (gtag.js) - Google Analytics