四种引用类型分析

数据类型
除了原始数据类型的变量,其他所有都是所谓的引用类型。
不同的引用类型,主要体现的是对象不同的可达性状态和对垃圾收集的影响(其实就是GCRoot中的可达性分析)

我们在创建各种引用并关联到响应对象时,可以选择是否需要关联引用队列。如果引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

强引用类型
即常见的普通对象,有引用指向对象,对象即还活着,不会被GC当做垃圾,即使OOM了也不会把强引用视为垃圾。但,一旦引用超出作用域或显示=null,则允许被GC当做垃圾,因为他已经不是强引用了…

软引用类型
只有当JVM内存不足的时候,GC才会把这种类型的数据当做垃圾。常和引用队列联合使用。它常被应用于缓存类场景。比如:头像图片,软引用保存在内存中,OOM了就回收掉。

SoftReference<String> sr = new SoftReference<String>(new String("hello"));

弱引用类型
GC当它是垃圾。常和引用队列联合使用。

WeakReference<String> sr = new WeakReference<String>(new String("hello"));

幻象引用类型
不能通过他访问数据,它是对象finalize的之后,剩下的。
访问他得到的永远是null。它必须和引用队列 (ReferenceQueue)联合使用。

Object counter = new Object(); 
ReferenceQueue refQueue = new ReferenceQueue<>(); PhantomReference<Object> p = new PhantomReference<>(counter, refQueue); 
counter = null;  //这两句是为了使其被GC视为垃圾,然后执行垃圾清理
Sysem.gc();
 try {  
 // Remove是一个阻塞方法,可以指定timeout,或者选择一直阻塞  
 Reference<Object> ref = refQueue.remove(1000L); 
  if (ref != null) {
   // do something
   } 
 } catch (InterruptedException e) {  
 // Handle it
 }

注意:以上所说的只是被GC当做垃圾,而不是触发GC,不是一回事儿。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缔曦_deacy

码字不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值