现在的位置: 首页 > 综合 > 正文

Java WeakReference与SoftReference

2013年08月08日 ⁄ 综合 ⁄ 共 6118字 ⁄ 字号 评论关闭

在看Android源码时,时常看到有使用WeakReference,特别去了解了一下这个类。

中文名称叫弱引用,考虑到手机设备的内存相对小,所以Android源码中有很多地方使用到这个。


如下原文链接:http://blog.csdn.net/jinhuiyu/article/details/3709767

 要理解弱引用,首先要先了解一下强引用(Strong Reference),  其实我之前也并不了解强引用,虽然天天都在用。举例来说: 
       

  1. String abc = new String ("abcdf");

这就是创建了一个String的实例然后在变量abc中保存一个强引用,为什么说它强(Strong)呢?这是跟垃圾回收器相关的,如果一个对象是通过强引用链(Chain of Strong Reference) 访问到的,也就是像上面那样,那么这个对象是不会被垃圾回收器回收的,
这在正常情况下是正确的,因为你不想垃圾回收器回收你正在使用的对象。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemory错误,是程序异常终止,也不会为了解决内存不足而回收这类引用的对象。这就是使用强引用的一个问题, 强引用的另外一个常见的问题就是缓存, 特别是对于那些非常大的数据结构,像图片等等,平差情况下我们是希望程序能缓存这些大的数据结构的,因为重新加载非常耗费服务器资源。因为缓存就是为了避免重新加载这些大的数据结构的,所以缓存中会保存一个指向内存中数据结构的引用,而这些引用通常都是强引用,所以这些引用会强迫这些大的数据结构保存在内存中,除非用通过某些方法户知道哪一个数据结构不再需要保存在内存中了,然后再把他从缓存中清除。


弱引用就是不保证不被垃圾回收器回收的对象,它拥有比较短暂的生命周期,在垃圾回收器扫描它所管辖的内存区域过程中,一旦发现了只具有弱引用的对象,就会回收它的内存,不过一般情况下,垃圾回收器的线程优先级很低,也就不会很快发现那些只有弱引用的对象。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用的对象被垃圾回收的话,Java虚拟机就会把这个弱引用加入相关的引用队列中。
一下就是创建弱引用对象的例子。

  1. String abc = new String("abcde");
  2. WeakReference<String> wf= new WeakReference<String>(str, rq);


String abc1 = wf.get()//如果abcde这个对象没有被垃圾回收器回收,那么abc1就指向"abcde"对象


-----------------------------------------------------------------------------------------------------------------------------------------------------------


如下原文链接:  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的一个测试程序:

 

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

 程序运行结果:

 

Java代码  收藏代码
  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的一个测试程序:

 

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

 程序运行结果:

 

Java代码  收藏代码
  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  

 

抱歉!评论已关闭.