Java中的四种引用类型

Java中的四种引用类型

它们分别是强引用、软引用、弱引用、虚引用。设计这些引用的目的,是让程序员可以通过代码来控制对象的生命周期,让对象在不同情景下能够在不同时候被回收。

  1. 强引用
    我们平时写的代码,基本上都是强引用。
Object o = new Object();

强引用的对象永远都不会被回收,即使jvm内存不足,也只会抛出OOM。如果想要回收该对象,就只能把强引用和对象之间的关联进行中断。

o = null;

在实际开发中,看到有一些对象被手动赋值为null,很大可能就是为了提醒jvm可以回收该对象了。
2. 软引用(SoftReference)
软引用就是用SoftReference包裹一下。

SoftReference<Stu> stuSoftReference = new SoftReference<Stu>(new Stu());
// 要获取软引用包裹的对象,get就行
Stu stu = stuSoftReference.get();
System.out.println(stu);

当内存不足时,会触发JVM 的 gc ,如果gc后,内存还是不足,就会把软引用包裹的对象回收掉。

SoftReference<byte[]> sr = new SoftReference<byte[]>(new byte[1024*1024*10]);
System.out.println(sr.get());
System.gc();
System.out.println(sr.get());

byte[] bytes = new byte[1024*1024*10];
System.out.println(sr.get());

运行程序,加入最大堆内存20M的参数

-Xmx20M

运行结果表示,手动完成GC后,软引用对象包裹的byte[]还没被回收,但是新建了一个10M的byte[]后,最大堆内存不够了,就会把软引用包裹的byte[]回收掉,否则会抛出OOM。
软引用适合用作缓存。当内存足够时,就能正常拿到缓存,当内存不够时,就把缓存回收掉,不至于马上抛出OOM。

  1. 弱引用(WeakReference)
    弱引用的使用和软引用类似,只是关键字变成了WeakReference:
		<byte[]> weakReference = new WeakReference<byte[]>(new byte[1024*1024*10]);
        System.out.println(weakReference.get());
        System.gc();
        System.out.println(weakReference.get());
        

从运行结果可以看到,只要发生了GC,即使内存充足,弱引用包裹的对象也会被回收。
弱引用一般用于TheadLoacl、WeakHashMap。

  1. 虚引用(PhantomReference)
    虚引用的特点:无法通过虚引用来获取一个对象的真实引用。必须和ReferenceQuene一起使用,当GC 准备回收一个对象时,它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQuene中。
		ReferenceQueue queue = new ReferenceQueue();
        List<byte[]> bytes = new ArrayList<>();
        PhantomReference<Student> reference = new PhantomReference<Student>(new Student(),queue);
        new Thread(() -> {
            for (int i = 0; i < 100;i++ ) {
                bytes.add(new byte[1024 * 1024]);
            }
        }).start();
 
        new Thread(() -> {
            while (true) {
                Reference poll = queue.poll();
                if (poll != null) {
                    System.out.println("虚引用被回收了:" + poll);
                }
            }
        }).start();
        Scanner scanner = new Scanner(System.in);
        scanner.hasNext();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值