装载自:http://flyneil.iteye.com/blog/1345177

WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关。

WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。

最近在JDK的Proxy类的实现代码中也发现了Weakrefrence的应用,Proxy会把动态生成的Class实例暂存于一个由Weakrefrence构成的Map中作为Cache。

SoftReference是强引用,它保存的对象实例,除非JVM即将OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中。这样可以系统设计得更具弹性。

WeakReference的一个测试程序:

  1. import java.lang.ref.WeakReference;
  2. public class WeakReferenceTest {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. A a = new A();
  8. a.str = "Hello, reference";
  9. WeakReference<A> weak = new WeakReference<A>(a);
  10. a = null;
  11. int i = 0;
  12. while (weak.get() != null) {
  13. System.out.println(String.format("Get str from object of WeakReference: %s, count: %d", weak.get().str, ++i));
  14. if (i % 10 == 0) {
  15. System.gc();
  16. System.out.println("System.gc() was invoked!");
  17. }
  18. try {
  19. Thread.sleep(500);
  20. } catch (InterruptedException e) {
  21. }
  22. }
  23. System.out.println("object a was cleared by JVM!");
  24. }
  25. }

运行结果为:

  1. Get str from object of WeakReference: Hello, reference, count: 1
  2. Get str from object of WeakReference: Hello, reference, count: 2
  3. Get str from object of WeakReference: Hello, reference, count: 3
  4. Get str from object of WeakReference: Hello, reference, count: 4
  5. Get str from object of WeakReference: Hello, reference, count: 5
  6. Get str from object of WeakReference: Hello, reference, count: 6
  7. Get str from object of WeakReference: Hello, reference, count: 7
  8. Get str from object of WeakReference: Hello, reference, count: 8
  9. Get str from object of WeakReference: Hello, reference, count: 9
  10. Get str from object of WeakReference: Hello, reference, count: 10
  11. System.gc() was invoked!
  12. object a was cleared by JVM!

SoftReference的一个测试程序:

  1. import java.lang.ref.SoftReference;
  2. public class SoftReferenceTest {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. A a = new A();
  8. a.str = "Hello, reference";
  9. SoftReference<A> sr = new SoftReference<A>(a);
  10. a = null;
  11. int i = 0;
  12. while (sr.get() != null) {
  13. System.out.println(String.format("Get str from object of SoftReference: %s, count: %d", sr.get().str, ++i));
  14. if (i % 10 == 0) {
  15. System.gc();
  16. System.out.println("System.gc() was invoked!");
  17. }
  18. try {
  19. Thread.sleep(500);
  20. } catch (InterruptedException e) {
  21. }
  22. }
  23. System.out.println("object a was cleared by JVM!");
  24. }
  25. }

运行结果为:

  1. Get str from object of SoftReference: Hello, reference, count: 1
  2. Get str from object of SoftReference: Hello, reference, count: 2
  3. Get str from object of SoftReference: Hello, reference, count: 3
  4. Get str from object of SoftReference: Hello, reference, count: 4
  5. Get str from object of SoftReference: Hello, reference, count: 5
  6. Get str from object of SoftReference: Hello, reference, count: 6
  7. Get str from object of SoftReference: Hello, reference, count: 7
  8. Get str from object of SoftReference: Hello, reference, count: 8
  9. Get str from object of SoftReference: Hello, reference, count: 9
  10. Get str from object of SoftReference: Hello, reference, count: 10
  11. System.gc() was invoked!
  12. Get str from object of SoftReference: Hello, reference, count: 11
  13. Get str from object of SoftReference: Hello, reference, count: 12
  14. Get str from object of SoftReference: Hello, reference, count: 13
  15. Get str from object of SoftReference: Hello, reference, count: 14
  16. Get str from object of SoftReference: Hello, reference, count: 15
  17. Get str from object of SoftReference: Hello, reference, count: 16
  18. Get str from object of SoftReference: Hello, reference, count: 17
  19. Get str from object of SoftReference: Hello, reference, count: 18
  20. Get str from object of SoftReference: Hello, reference, count: 19
  21. Get str from object of SoftReference: Hello, reference, count: 20
  22. System.gc() was invoked!
  23. Get str from object of SoftReference: Hello, reference, count: 21
  24. Get str from object of SoftReference: Hello, reference, count: 22
  25. Get str from object of SoftReference: Hello, reference, count: 23
  26. Get str from object of SoftReference: Hello, reference, count: 24
  27. Get str from object of SoftReference: Hello, reference, count: 25
  28. Get str from object of SoftReference: Hello, reference, count: 26
  29. Get str from object of SoftReference: Hello, reference, count: 27
  30. Get str from object of SoftReference: Hello, reference, count: 28

在实际应用用,我用到SoftReference去保存以下图片对象缓存,UI间传递的对象引用等。

WeakReference 与 SoftReference 区别的更多相关文章

  1. Java 中 WeakReference 与 SoftReference 的区别?

    虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率, 但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而软引用 虽然不 ...

  2. Java中的 WeakReference 和 SoftReference

    我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...

  3. WeakReference与SoftReference

    WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关. WeakReference是弱引用,其中保存的对象实例可以被GC回收掉.这个类通常用于在某 ...

  4. 【转】Java之WeakReference与SoftReference使用讲解

    Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中.这些类还提供了与垃圾收集器(garbage collector)之间有限的交互. 1.先“ ...

  5. java基础回顾(六)——WeakReference、SoftReference

    在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1) ...

  6. Java的引用StrongReference、 SoftReference、 WeakReference 、PhantomReference

    1. Strong Reference StrongReference 是 Java 的默认引用实现,  它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收 @Te ...

  7. Android内存管理(3)缓存不要用SoftReference, 用android.util.LruCache

    A reference that is cleared when its referent is not strongly reachable and there is memory pressure ...

  8. 转:最近5年133个Java面试问题列表

    最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...

  9. [翻译]Understanding Weak References(理解弱引用)

    原文 Understanding Weak References Posted by enicholas on May 4, 2006 at 5:06 PM PDT 译文 我面试的这几个人怎么这么渣啊 ...

随机推荐

  1. 解决 Windows启动时要求验证

    KB971033 微软检测盗版jar SLMGR -REARM 出现Window启动时要求验证版本, 在cmd窗口输入命令重新配置 重新启动即可 出现错误:解决办法 开始→设置,打开控制面板的“添加和 ...

  2. php自定义错误处理函数

    function myErrorHandler($errno, $errstr, $errfile, $errline) { echo "<b>Custom error:< ...

  3. 在谷歌中缓存下载视频离线观看,js代码

    var download=function(urlInfo) { when(createFile(localFileName)) .then(function (fileInfo) { var dow ...

  4. 提取站长之家IP批量查询

    1.工具说明 写报告的时候为了细致性,要把IP地址对应的地区给整理出来.500多条IP地址找出对应地区复制粘贴到报告里整了一个上午. 为了下次更好的完成这项重复性很高的工作,所以写了这个小的脚本. 使 ...

  5. systemctl daemon-reload

    systemctl daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载. init 和 sy ...

  6. js函数(3)

    8.5 作为命名空间的函数 即定义一个函数用做临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间. 将一段代码封装在函数内部,然后调用这个函数.这样全局变量就变成了函数内部的局部变量: ...

  7. [OpenCV] sift demo

    运行环境:vs2012+opencv320 sift 需要的头文件为 <opencv2/xfeatures2d.hpp> #include <opencv2/opencv.hpp&g ...

  8. 大白带你侃JAVA——封装的概述及好处

    封装概述: 封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式 这是什么意思呢? 简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, "锁起来" ,我们只留下 ...

  9. 【Funny Things】002——鞋的颜色

    网上的那张鞋子的图片到底是什么颜色的?灰绿色还是粉色? 1. 先截取图片中鞋的那块的图片,获取大小 2. 带入大小分别计算R,G,B平均值 3. 通过计算所得的数据画图可得结果 from PIL im ...

  10. 【AtCoder】AGC008

    AGC008 A - Simple Calculator 如果符号相同,那么如果y比x大直接走,否则需要两次反号 如果符号不同,需要绝对值的差加一次反号 如果有一个是0,且y比x要小,那只需要一次反号 ...