Java学习笔记 (二十九) java中的四种引用

为了更好的管理内存,有利于垃圾回收.
JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种。

强引用(Strong Reference)

如下:

  List list=new ArrayList();
  Map map=new HashMap();

以上都是强引用,只要强引用还存在,垃圾收集器永远都不会回收被引用的对象,即使抛出OOM异常。

软引用(Soft Reference)

软引用可以用在那些有点用但是不是必须的对象上。
对于软引用的被引用对象 来说,在内存不足即将OOM 之前会将对象回收。
可以使用SoftReference类来实现软引用。

        SoftReference softReference=new SoftReference(new ArrayList<>());
        //回收之前会返回 对象的强引用
        softReference.get();
        //假设内存不足 该对象被回收 
        System.gc();
        //回收之后 返回null
        softReference.get();

弱引用(Weak Reference)

弱引用也是使用在那些不是必需的对象上的。但是它的强度要比软引用弱一些,被弱引用关联的对象只能生存到下一次垃圾回收前。
也就是当垃圾收集器工作时,无论当前内存是否足够,对象都会被回收。
WeakReference 类可以来实现弱引用。

        WeakReference weakReference=new WeakReference(new ArrayList<>());
        //回收之前会返回 对象的强引用
        weakReference.get();
        System.gc();
        //回收之后 返回null
        weakReference.get();

虚引用(PhantomReference)

虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。
一个对象是否有虚引用,完全不会对其生存时间构成影响。也无法通过虚引用得到一个对象的强引用。
虚引用需要和引用队列一起使用,如果一个对象设置了虚引用,在对象被回收时,虚引用将会加入了引用队列之中。
如下:

 public static void main(String []a)throws Exception{
        ReferenceQueue referenceQueue=new ReferenceQueue();
        PhantomReference phantomReference=new PhantomReference(new String("I Love LSM"), referenceQueue);
        Object obj= referenceQueue.poll();
        System.out.println("垃圾回收前:"+obj);
        System.gc();
        Thread.sleep(3000);
        Object object=referenceQueue.poll();
        System.out.println("垃圾回收后:"+object);

    }

注意: System.gc()调用只是通知虚拟机进行回收,垃圾收集器并不一定马上会进行垃圾回收。

参考资料

学习摘抄于深入理解Java虚拟机

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值