性能优化(三)引用类型

java引用类型

分四种 想必大家都不陌生

强软弱虚

引用分优先级 依次是 强 软 弱 虚

强引用

  • java中默认声明就是强引用例如Object o=new Object()
  • 只要该对象强引用存在,垃圾回收器将永远不会回收被引用的对象,JVM即使程序抛出out of memory(内存溢出)GC也不会回收
  • 如果想要被Gc回收则需要手动将 强应用对象赋值为null

软引用

  • 软引用是用来描述一些非必需但仍有用的对象,只有内存不足时才回收
  • 在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常
  • java用softReference来表示软引用
    • 示例

弱引用

  • 弱引用的引用强度比软引用要更弱一些,

  • Gc发现当前对象仅只有一个弱引用时,无论内存是否足够,只要进行垃圾回收,那些被弱引用关联的对象都会被回收,当时如果当前对象存在强引用或者软引用则不会被回收

  • javaWeakReference来表示弱引用

    • 示例

    • public static void main(String[] args){
      		// String 类型123 被强软弱引用
      		// 默认强引用
      		String str=new String("123");
      		// 软引用
      		SoftReference<String> softStr=new SoftReference<String>(str);
      		// 弱引用
      		WeakReference<String> weakStr=new WeakReference<String>(str);
      		
      		System.out.println("强引用:"+str);
      		System.out.println("软引用获取到的:"+softStr.get());
      		System.out.println("弱引用获取到的:"+weakStr.get());
      		//取消强引用
      		str=null;
      		//取消软引用的引用链
      //		softStr.clear();
      		
      		System.gc();
      		
      		System.out.println("强引用:"+str);
      		System.out.println("软引用:"+softStr.get());
      		System.out.println("弱引用:"+weakStr.get());
      	}
      /// 输出结果
      强引用:123
      软引用获取到的:123
      弱引用获取到的:123
      强引用:null
      软引用:123
      弱引用:123
       /// 若取消软引用的引用链则输出
      强引用:123
      软引用获取到的:123
      弱引用获取到的:123
      强引用:null
      软引用:null
      弱引用:null
      

虚引用

  • 如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收

  • java用PhantomReference来表示虚引用

  • 主要功能用于检测对象有没有被引用,必须要配合ReferenceQueue来使用

  • 看其源码

    • public class PhantomReference<T> extends Reference<T> {
          public T get() {
              return null;
          }
      
          public PhantomReference(T referent, ReferenceQueue<? super T> q) {
              super(referent, q);
          }
      
      }
      
    • 内部仅有一个构造函数,和get方法且返回的是null

      • 这说明我们无法从虚引用中获取对象
      • 必须配合ReferenceQueue来使用

引用队列 ReferenceQueue

  • 引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。
  • 与软引用、弱引用不同,虚引用必须和引用队列一起使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值