JAVA中的四种引用

在java中,有四种引用,分别为强引用、软引用、弱引用与虚引用,它们有各自不同的特性,使用场景也各不相同,下面我就对他们分别作出说明。

强引用

强引用是最普遍的引用。如果对象具有强引用,那么垃圾回收器绝不会回收它。当内存空间不足时,jvm宁愿OOM也不会随意回收具有强引用的对象。如果强引用的对象不使用时,需要将它弱化从而使GC能够回收它。比如显示的将它置为null;或者让其超出对象的生命周期范围,那么GC就认为该对象不存在引用,这时就能回收它了。具体什么时候回收就要取决于GC算法了。

   public void test(){
       // 强引用
       Object strongReference = new Object();
   } 

在一个方法内部有一个强引用,这个引用保存在中,而引用的对象保存在中。当这个方法运行完成后,就会退出方法栈,引用对象的引用数就是0,这个对象就可以被回收。
但是如果这个对象是全局变量时,就需要在不使用时将其置为null,否则无法被垃圾回收。

软引用

如果一个对象只具有软引用,则内存空间充足时,垃圾回收不会回收它;如果内存空间不足时,就会回收这些对象。只要垃圾回收没有回收它,该对象就可以被程序使用。

       // 强引用
       String strongReference = new String("123");
       // 软引用
       String str = new String("123");
       SoftReference<String> softReference = new SoftReference<>(str);

当内存不足时,jvm会首先将软引用的对象引用置为null,然后通知垃圾回收器进行回收。而且jvm会尽可能的优先回收长时间闲置不用的软引用对象。对那些刚构建或刚使用过的软引用对象会尽可能保留。为此引入了引用队列(ReferenceQueue)的概念。如果软引用的对象被垃圾回收,jvm就会把这个软引用加入到与之关联的引用队列中。

弱引用

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短的生命周期。在垃圾回收器进行扫描时,一旦发现只有弱引用的对象,不管内存空间是否充足,都会回收它。不过,垃圾回收器是一个优先级很低的线程,因此不一定很快就能发现那些只有弱引用的对象。

     // 弱引用
     String str = new String("123");
     WeakReference<String> weakReference = new WeakReference<>(str);

如果一个对象很少被使用,并且希望在使用时随时就能获得,但又不想影响此对象的垃圾回收,那么就可以用WeakReference来记住此对象。

如果你希望将一个弱引用变成强引用,可以使用weakReference.get();

      // 弱引用
      String str = new String("123");
      WeakReference<String> weakReference = new WeakReference<>(str);
      // 弱引用转强引用
      String strongReference = weakReference.get();

同样,如弱引用的对象被垃圾回收,jvm就会把这个弱引用加入到与之关联的引用队列中。

虚引用

虚引用顾名思义,就是形同虚设。虚引用并不会决定对象的生命周期,如果一个对象只有虚引用,那它就和没有任何引用一样,在任何时候都可以被垃圾回收器回收。

虚引用必须和引用队列联合使用。当垃圾回收器回收一个对象时,如果发现他有虚引用,就会在回收对象前,把虚引用加入与之关联的引用队列中。

       String str = new String("123");
       // 引用队列
       ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
       // 虚引用
       PhantomReference<String> phantomReference = new PhantomReference<>(str,referenceQueue);

虚引用主要用来跟踪对象被垃圾回收的活动。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否要进行垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

总结

引用级别强 -> 弱 : 强引用 -> 软引用 -> 弱引用 -> 虚引用

引用类型 被垃圾回收时间 用途 生存时间
强引用 从不会 对象的一般状态 jvm终止
软引用 内存不足时,先回收长时间不用的 对象缓存 内存不足
弱引用 垃圾回收时 对象缓存 垃圾回收
虚引用 垃圾回收时 跟踪对象的垃圾回收 垃圾回收
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容