`

Java的弱引用(Weak Reference)

    博客分类:
  • JAVA
 
阅读更多

 

 之前一直没有接触过弱引用这个概念,今天看到以后觉得挺新鲜,就查了查资料总结一下,希望对大家有所帮助。
 要理解弱引用,首先要先了解一下强引用(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://yangguangfu.iteye.com/blog/849317



内存优化的两个类:SoftReference 和 WeakReference


如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。

 java.lang.ref.WeakReference

A obj = new A();  
       
        WeakReference wr = new WeakReference(obj);  
       
        obj = null;  
       
        //等待一段时间,obj对象就会被垃圾回收  
        
      ...  
       
      if (wr.get()==null) {  
        
        
      System.out.println("obj 已经被清除了 ");  
        
        
      } else {  
        
      System.out.println("obj 尚未被清除,其信息是 "+obj.toString());  
        
      }  
 



  不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。

 在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。

  这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。

  
    java.lang.ref.SoftReference

 Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。
    A obj = new A();
    
       SoftRefenrence sr = new SoftReference(obj);
  引用时

if(sr!=null){
	 
	       obj = sr.get();
	 
	   }else{
	 
	       obj = new A();
	 
	       sr = new SoftReference(obj);
	 
	   }
 
分享到:
评论

相关推荐

    理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:)  1....

    详解Java弱引用(WeakReference)的理解与使用

    主要介绍了Java弱引用(WeakReference)的理解与使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    函数weak属性理解_弱声明实例

    学习理解函数加上weak后的变化

    java集合-WeakHashMap的使用

    WeakHashMap是Java中的一种特殊的哈希表实现,它使用弱引用(Weak Reference)来保存键对象。当键对象没有被其他强引用引用时,在垃圾回收时会自动从WeakHashMap中移除对应的键值对。

    弱关系的力量The strength of weak ties

    研究发现:其实与一个人的工作和事业关系最密切的社会关系并不是“强关系”,而常常是“弱关系”。“弱关系”虽然不如“强关系”那样坚固(金字塔),却有着极快的、可能具有低成本和高效能的传播效率。

    弱lru高速缓存:使用LRU和弱引用以与垃圾回收协调工作的方式缓存数据的缓存

    它使用LRU / LFU(LRFU)到期来保留引用的数据,然后,一旦数据处于非活动状态,它将使用弱引用(和终结注册表)来允许GC作为正常GC周期的一部分删除缓存的数据,但仍然继续只要数据仍驻留在内存中并且尚未被收集,...

    Python3标准库:weakref对象的非永久引用.docx

    weakref模块支持对象的弱引用。正常的引用会增加对象的引用数,并避免它被垃圾回收。但结果并不总是如期望中的那样,比如有时可能会出现一个循环...弱引用(weak reference)是一个不能避免对象被自动清理的对象句柄。

    Python Weak Reference Ext.-开源

    该项目展示了 CPython 的“弱引用”C 扩展对象的实现。 该代码经过编写和测试以与 Python 2.0 兼容。

    java7帮助文档

    see Appendix D: Disabling Cryptographic Algorithms in Java PKI Programmer's Guide and Disabled Cryptographic Algorithms in Java Secure Socket Extension (JSSE) Reference Guide. Various enhancements ...

    Java开发规范(通用)

    这是一个很全面的Java开发规范,涉及到命名规则,常量定义,格式制约,oop,集合处理,并发处理,控制语句,注释规约,接口文档,异常处理,日志规约,建表规约,索引规约,SQL规约,orm规约,安全规约,git版本控制...

    ARM 之十一__weak 代码 WEAK.7z

    博文 ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用 的测试代码,备用!

    VSoft.WeakReferences:德尔福的弱引用

    VSoft.WeakReference 该单元背后的思想是提供与Delphi中引用计数对象类似的生命周期...可以弱引用的类需要从TWeakReferencedObject 。 type TParent = class(TWeakReferencedObject, IParent) ... end; TChild =

    Weak-Password.zip

    压缩包包含了常见的弱口令用户名,弱口令密码。包含常见的服务ftp、telnet、mysql等。还有sql注入测试代码。

    weak galerkin finite element meathods on polytopal

    weak galerkin finite element meathods on polytopal

    weak-ptr 和 shared-ptr 源码

    关于C++智能指针 weak_ptr (弱引用 智能指针) 和 shared_ptr (强引用 智能指针)的源文件。 资源分不能设为0了。。

    weakable-self:Swift微框架可轻松处理内部封闭中对自身的弱引用

    弱自我 ...此微框架的目的是为开发人员提供weakify的帮助功能,使他可以声明性地表示自己希望使用弱的非可选引用来封闭self ,而不必担心如何提供此引用。 用法 使用此weakify功能,以上代码将转换为

    iOS 中weak的实现代码示例

    weak 属性关键字就是弱引用,它不会增加引用计数但却能保证指针的安全访问,在对象释放后置为 nil,从而避免错误的内存访问。主要为了解决循环引用的问题。 接下来,我们会从 objc 库中的 NSObject.mm、 objc-weak....

    weak操作入门(数据挖掘)

    让你轻松掌握weka操作方法,以便进行数据挖掘,这是简单介绍怎么使用这个软件的一个文档

    The strength of weak learnability.pdf

    The strength of weak learnability.pdf

Global site tag (gtag.js) - Google Analytics