• Java 强引用,软引用,弱引用


    1、强引用

         public void handleMessage(Message msg) {
    	
    	        case FAIL:
    		         GoplayException mException = new GoplayException();
    		         setVideoUrlFailReason(mException);
    		         mListener.onFailed(mException);
    		         break;
         }

       protected void setVideoUrlFailReason(GoplayException mResult) {
       ......
       }


       public void onFailed(GoplayException e) {
       .....
       }


         首先创建了一个强引用对象,mException首先指向堆内存的地址。

    引用计数为1。

         setVideoUrlFailReason,又有一个局部变量mResult指向了相同堆内存地址。引用计数为2。

         随着setVideoUrlFailReason函数的结束, 引用计数降低1,眼下为1。

         mListener.onFailed,又有一个局部变量e指向相同堆内存地址,引用计数加1,眼下为2。

         随着onFailed函数结束,引用计数减1。眼下为1。

         最后随着handleMessage函数结束,引用计数减1,眼下为0。

      

         强引用对象仅仅有引用计数为0,或者被赋值为null,java垃圾回收器才会回收。

         强引用是使用最普遍的引用。

    假设一个对象具有强引用。那垃圾回收器绝不会回收它。当内存空间不足。Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠任意回收具有强引用的对象来解决内存不足的问题

    2、软引用

         假设一个对象仅仅具有软引用,则内存空间足够。垃圾回收器就不会回收它;假设内存空间不足了,就会回收这些对象的内存。仅仅要垃圾回收器没有回收它。该对象就能够被程序使用。

         使用软引用:

    MyObject aRef = new  MyObject();  
    SoftReference aSoftRef=new SoftReference(aRef);  
          从软引用中获取对象:

    MyObject anotherRef=(MyObject)aSoftRef.get();

    3、弱引用

          弱引用与软引用的差别在于:仅仅具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中。一旦发现了仅仅具有弱引用的对象。无论当前内存空间足够与否,都会回收它的内存。只是。因为垃圾回收器是一个优先级非常低的线程,因此不一定会非常快发现那些仅仅具有弱引用的对象。

          使用弱引用:

    MyObject aRef = new  MyObject();  
    SoftReference aSoftRef=new WeakReference(aRef);  

          从弱引用中获取对象:

    MyObject anotherRef=(MyObject)aSoftRef.get();

  • 相关阅读:
    php中&符号什么意思
    lucene 笔记
    yslow详细解释
    sqlserver中如何实现时间按月,日,小时分组查询
    用Lucene.net对数据库建立索引及搜索2
    lucene.net索引文件存储简析
    C #中的几个线程同步对象方法 1
    lucene 全文检索简介
    判断jquery对象是否可见
    Lucene.net多字段(Fields)、多索引目录(IndexSearcher)搜索
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5230526.html
Copyright © 2020-2023  润新知