java4种_【Java语言特性学习之三】Java4种对象引用

本文介绍了Java中四种引用类型:强引用、软引用、弱引用和虚引用,分别阐述了它们的生命周期、回收策略和应用场景,如内存管理、缓存优化和对象跟踪。通过实例演示,理解不同引用类型的使用技巧和避免内存溢出的方法。
摘要由CSDN通过智能技术生成

为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为(引用的级别和强度由高到低)强引用、软引用、弱引用、虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使用不同的处理方式。

在Java中,垃圾回收器线程一直在默默的努力工作着,但你却无法在代码中对其进行控制。无法要求垃圾回收器在精确的时间点对某些对象进行回收。有了这些引用类型之后,可以一定程度上增加对垃圾回收的粒度把控,可以让垃圾回收器在更合适的时机回收掉那些可以被回收掉的对象,而并不仅仅是只回收不再使用的对象。

6bc329ca5e5c2a1bbd3ae117e8424fa9.png

1、强引用:使用最普遍的引用,一般情况下,垃圾回收器绝对不会回收它。当内存不足时,抛出OOM。

如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

packagereference;importjava.lang.ref.PhantomReference;importjava.lang.ref.ReferenceQueue;importjava.lang.ref.SoftReference;importjava.lang.ref.WeakReference;public classReference {public static voidmain(String[] args) {//强引用

Object object = newObject();

Object[] objArr= newObject[Integer.MAX_VALUE];//报错:java.lang.OutOfMemoryError

object = null;

objArr= null;

}

}

2、软引用:内存空间足够,垃圾回收器不会回收它。反之,则回收。适用于缓存,而且不会OOM。

软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。

对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

packagereference;importjava.lang.ref.PhantomReference;importjava.lang.ref.ReferenceQueue;importjava.lang.ref.SoftReference;importjava.lang.ref.WeakReference;public classReference {public static voidmain(String[] args) {//软引用

Obj obj = newObj();

SoftReference sr = new SoftReference(obj);

obj= null;

System.out.println(sr.get());//reference.Obj@7852e922

}

}

3、弱引用:只有当垃圾回收器扫描到弱引用指向的对象时,才会回收它。生命周期比软引用更短。

弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。所以被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。

packagereference;importjava.lang.ref.PhantomReference;importjava.lang.ref.ReferenceQueue;importjava.lang.ref.SoftReference;importjava.lang.ref.WeakReference;public classReference {public static voidmain(String[] args) {//弱引用

WeakReference ss = new WeakReference(new String("hello"));

System.out.println(ss.get());//hello

System.gc(); //通知JVM的gc进行垃圾回收

System.out.println(ss.get());//null

}

}

4、虚引用:在任何时候都可能被垃圾回收器回收,必须与引用队列关联使用。

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收的活动。

虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

packagereference;importjava.lang.ref.PhantomReference;importjava.lang.ref.ReferenceQueue;importjava.lang.ref.SoftReference;importjava.lang.ref.WeakReference;public classReference {public static voidmain(String[] args) {//虚引用

ReferenceQueue queue = new ReferenceQueue();

PhantomReference pr = new PhantomReference(new String("hello"), queue);

System.out.println(pr.get());//null

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值