Java 四种引用

背景

最近被问到了Java的四种引用类型,其实这个东西我之前有个概念,但是记得不是很清楚了。借着这个机会复习一下。

引用的概念

其实这个和Java的GC很相关,当虚拟机内存不足的时候发生GC,那么到底需要回收哪些对象呢?这里有很多GC算法,但是基本都逃不过一个基本的理念:计算对象的引用状况。比如引用计数,可达性分析等等,本质上都是在考察该对象是不是被其他对象引用。但是如果虚拟机发现现在所有的对象都是被引用的,那么这个时候该回收谁?为了区分这些对象呗引用的"强度",jdk在1.2之后,增加了三种其他类型的引用。

强引用

这个就是我们平时的赋值操作。

public class Main {
    public static void main(String[] args) {
        Object o=new Object();
    }
}

比如这种,就是强引用。强引用的对象在gc分析它确实是存在被引用的时候,是不会被回收的。

软引用

这个一般描述为还有用,但是不是必须的对象,在gc的时候可以选择牺牲它来阻止OOM。其实很类似于缓存,在JVM内存充足的时候可以存活,在JVM内存即将耗尽时选择退出。

public class Main {
    public static void main(String[] args) {
        ReferenceQueue q=new ReferenceQueue();
        Object obj=new Object();
        SoftReference sr=new SoftReference(obj,q);
        if(sr!=null){
            obj=sr.get();
        }
    }
}

弱引用

用于描述比软引用更加“没用“的对象。在发生GC的时候,一定会被回收。

public class Main {
    public static void main(String[] args) {
        ReferenceQueue q=new ReferenceQueue();
        Object obj=new Object();
        WeakReference wk=new WeakReference(obj,q);
        if(wk!=null){
            obj=wk.get();
        }
    }
}

虚引用

这个看名字就发现问题了,它不能用于获取对象实例。GC时也会被直接回收。
基本就是这些了。其实貌似在项目代码里面没咋见过这些东西的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值