zoukankan      html  css  js  c++  java
  • WeakReference 与 SoftReference 区别

    装载自: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.   
    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. }  

    运行结果为:

    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.   
    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. }  

    运行结果为:

    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间传递的对象引用等。

  • 相关阅读:
    Java内存模型与volatile
    Struts2验证框架的注意事项
    利用Java编写简单的WebService实例
    加速Java应用开发速度1——加速spring/hibernate应用调试时启动速度
    Java关键字synchronized详解
    JAVA对象的序列化与反序列化
    加速Java应用开发速度3——单元/集成测试+CI
    java程序性能优化之找出内存溢出元凶
    加速Java应用开发速度2——加速项目调试启动速度
    java实现动态切换上网IP (ADSL拨号上网)
  • 原文地址:https://www.cnblogs.com/evilKing/p/4621831.html
Copyright © 2011-2022 走看看