java里的四种引用

前言

       各位读者朋友们, 你们好, 这节我们对 java 中的引用再做一个概述, JDK1.2 版之后,Java 对引用的概念进行了扩充, 将引用分为了 4 种类型, 强引用, 软引用, 弱引用, 虚引用接着我们来一一论述

目录

强引用(Strong Reference)

软引用(Soft Reference)

弱引用(Weak Reference)

虚引用(Phantom Reference)


强引用(Strong Reference)

       强引用也是最常见的引用类型, 类似于Object obj=new Object()这种引用关系就称为强引用, 只要强引用关系还在, GC就不会去回收这个对象

       只要强引用的对象是可触及的, 那么就不会被回收, 相对的,软引用、弱引用和虚引用的对象是软可触及、弱可触及和虚可触及的 , 在一定条件下,都是可以被回收的。所以,强引用是造成 Java 内存泄漏的主要原因之一。        

Object obj=new Object();
obj = null;

像上面这种显示的释放掉引用则会使这个对象将来可能被回收(或者脱离引用的作用域)

软引用(Soft Reference)

     其余 3种引用均可以在 java.lang.ref 包中找到它们的身影。

       软引用是用来描述一些还有用,但非必需的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。注意,这里的第一次回收是不可达的对象

       意思就是说, jvm 一般不去清理软引用管理的对象, 而是在内存快要满时, 才会去清理它们, 软引用的存活时间相对于后两种引用来说能长一些

软引用示例如下: 

Object obj = new Object(); //声明强引用
SoftReference<Object> soft = new SoftReference<>(obj);
obj = null;  //销毁强引用

此时 soft 就是一个软引用
        垃圾回收器在某个时刻决定回收软可达的对象的时候,会清理软引用,并可选地把引用存放到一个引用队列(Reference Queue)。基于软引用的特点, 其通常用来实现内存敏感的缓存, 例如高速缓存就用到软引用

弱引用(Weak Reference)

      认识了软引用, 那么弱引用就好理解了 , 它只能生存到下次垃圾回收前, 也就是发现了就回收

       弱引用也是用来描述那些非必需对象,只被弱引用关联的对象只能生存到下一次 垃圾收集发生为止。在系统 GC 时,只要发现弱引用,不管系统堆空间使用是否充足,都会回收掉只被弱引用关联的对象。

弱引用示例如下: 

Object obj = new Object(); 
WeakReference<Object> weak = new WeakReference<>(obj);
obj = null;

这里代码只是和软引用使用的类不同

      软引用和弱引用最大的不同就是 :  GC时, 软引用会通过算法检查是否需要回收, 而弱引用发现了就会被回收 

虚引用(Phantom Reference)

      虚引用也叫 幽灵引用 或者 幻影引用 , 是最弱的一个引用

         一个对象是否有虚引用的存在,完全不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它和没有引用几乎是一样的,随时都可能被垃圾回收器回收。

并且虚引用必须要同一个引用队列才能使用

// 声明强引用 
Object obj = new Object(); 
// 声明引用队列 
ReferenceQueue phantomQueue = new ReferenceQueue(); 
// 声明虚引用(还需要传入引用队列) 
PhantomReference<Object> sf = new PhantomReference<>(obj, phantomQueue); 
obj = null;

         回收虚引用所指向的对象时, 如果此对象已经执行过 finalize() 方法, 此时会把这个对象加入到传入的队列中, 你可以通过队列里是否还有对象来判断这个对象什么时候被回收

虚引用的主要作用是跟踪它引用对象被GC回收的活动

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值