`

Java中弱引用、软引用、虚引用及强引用的区别

阅读更多

        很早Java API就添加了弱引用(WeakReference)和软引用(SoftReference),但并不是所有的程序员都熟悉这两个概念。知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用。我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型。这正是Java中弱引用和软引用的主要区别。如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式。相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象。弱引用和软引用的特殊行为使得它们在某些情况下非常有用。例如:软引用可以很好的用来实现缓存,当JVM需要内存时,垃圾回收器就会回收这些只有被软引用指向的对象。而弱引用非常适合存储元数据,例如:存储ClassLoader引用。如果没有类被加载,那么也没有指向ClassLoader的引用。一旦上一次的强引用被去除,只有弱引用的ClassLoader就会被回收。这篇文章中我们将讲述不同类型的Java引用,例如:强引用(Strong Reference)和虚引用(PhantomReference)。

Java中弱引用VS软引用

        Java中有如下四种类型的引用:

        a.强引用(Strong Reference)
        b.弱引用(WeakReference)
        c.软引用(SoftReference)
        d.虚引用(PhantomReference)

        强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”的一个强引用。任何被强引用指向的对象都不能被垃圾回收器回收,这些对象都是在程序中需要的。弱引用使用java.lang.ref.WeakReference class 类来表示,你可以使用如下代码创建弱引用:

Counter counter = new Counter(); // strong reference - line 1 
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference 
counter = null; // now Counter object is eligible for garbage collection 

        现在只要你给强引用对象counter赋空值null,该对象就可以被垃圾回收器回收。因为该对象此时不再含有其他强引用,即使指向该对象的弱引用weakCounter也无法阻止垃圾回收器对该对象的回收。相反的,如果该对象含有软引用,Counter对象不会立即被回收,除非JVM需要内存。Java中的软引用使用java.lang.ref.SoftReference类来表示,你可以使用如下代码创建软引用:

Counter prime = new Counter(); // prime holds a strong reference – line 2 
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2   
prime = null; // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory

        强引用置空之后,代码的第二行为对象Counter创建了一个软引用,该引用同样不能阻止垃圾回收器回收对象,但是可以延迟回收,与弱引用中急切回收对象不同。鉴于软引用和弱引用的这一区别,软引用更适用于缓存机制,而弱引用更适用于存贮元数据。另一个使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一种实现。WeakHashMap有一个特点:map中的键值(keys)都被封装成弱引用,也就是说一旦强引用被删除,WeakHashMap内部的弱引用就无法阻止该对象被垃圾回收器回收。

        虚引用是java.lang.ref package包中第三种可用的引用,使用java.lang.ref.PhantomReference类来表示。拥有虚引用的对象可以在任何时候被垃圾回收器回收。和弱引用和软引用相似,你可以通过如下代码创建虚引用:

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference – line 3 
PhantomReference phantom = new PhantomReference(digit); // phantom reference to object created at line 3   
digit = null; 

        一旦移除强引用,第三行的DigitalCounter对象可以在任何时候被垃圾回收器回收。因为只有一个虚引用指向该对象,而虚引用无法阻止垃圾回收器回收对象。

        除了了解弱引用、软引用、虚引用和WeakHashMap,还需要了解ReferenceQueue。在创建任何弱引用、软引用和虚引用的过程中你可以通过如下代码提供引用队列ReferenceQueue:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup 
DigitalCounter digit = new DigitalCounter(); 
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue); 

        引用实例被添加在引用队列中,你可以在任何时候通过查询引用队列回收对象。一个对象的生命周期可以通过下图进行描述:

        这就是Java中弱引用和软引用的区别。我们还学到了一些基本的引用类:弱引用、软引用、虚引用以及WeakHashMap和WeakHashMap。总之,合理的使用引用可以帮助垃圾回收器更好的管理Java内存。

 

原文链接: javarevisited 翻译: ImportNew.com - 人晓
译文链接: http://www.importnew.com/10866.html

  • 大小: 31.5 KB
分享到:
评论

相关推荐

    Java中弱引用软引用虚引用及强引用的区别Java开发Ja

    强引用、弱引用、软引用和虚引用是四种不同的引用强度,它们在垃圾回收机制中扮演着不同的角色。了解这些引用类型对于优化内存使用、防止内存泄漏以及合理地控制对象生命周期至关重要。 1. **强引用(Strong ...

    Java 7之基础 - 强引用、弱引用、软引用、虚引用1

    Java 7之基础 - 强引用、弱引用、软引用、虚引用1

    强引用、软引用、弱引用、虚引用1

    从Java SE2开始,Java引入了四种不同类型的引用:强引用、软引用、弱引用和虚引用,它们各自具有不同的特点和用途,有助于程序员更精细地控制对象的生命周期,并优化垃圾回收过程。 1. 强引用(Strong Reference) ...

    Java对象的强、软、弱和虚引用1

    Java对象的引用类型是Java内存管理中的重要概念,特别是在JDK 1.2及后续版本中引入了四种级别的引用:强引用、软引用、弱引用和虚引用,以提供更精细的控制对象生命周期的能力。 1. **强引用(StrongReference)**: ...

    java弱引用

    在 Java 中,引用可以分为四类:强引用、软引用、弱引用和虚引用(也称为精灵引用)。弱引用是其中的一种,它们允许垃圾回收器在某些情况下回收对象,而不是像强引用那样坚持对象的存在。 弱引用的工作原理是,当...

    Java中的强软弱虚引用

    笔者自己的通俗总结,5分钟搞清楚java中强软弱虚引用的区别^_^

    Java中弱引用和软引用的区别以及虚引用和强引用介绍

    很早Java API就添加了弱引用(WeakReference)和软引用(SoftReference),但并不是所有的程序员都熟悉这两个概念

    referenceInJava:Java强引用,软引用,弱引用以及虚引用测试项目

    这个"referenceInJava"项目专注于探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型与垃圾收集(Garbage Collection, GC)机制密切相关,对于优化内存使用和防止内存泄漏至关重要。 1. **强...

    Java中强引用,软引用,弱引用概念解析

    Java 中强引用、软引用、弱引用概念解析 Java 中强引用、软引用、弱引用是 Java 语言...Java 中的强引用、软引用、弱引用和虚引用四种引用类型都有其特点和应用场景,选择合适的引用类型可以提高程序的性能和可读性。

    Android中的软引用和弱引用

    由于弱引用不会阻止垃圾收集,所以使用弱引用的对象在被创建后会很快变得不可达,除非有其他强引用指向它。这在一定程度上保证了内存的有效利用,避免了不必要的内存占用。 在Android中,软引用和弱引用常用于图片...

    Java对象的强、软、弱和虚引用

    在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,...

    java中的引用类型之强软弱虚详解

    Java 中的引用类型共有四种:强引用、软引用、弱引用和虚引用。每种类型都有其特点和应用场景。 强引用 强引用是使用最普遍的引用类型。如果一个对象具有强引用,那么垃圾回收器绝不会回收它。当内存空间不足时,...

    强,软,弱,虚1

    本文将深入探讨四种引用类型:强引用、软引用、弱引用和虚引用。 首先,我们来理解强引用(Strong Reference)。强引用是最常见的引用类型,它代表了程序中的普通对象引用。当一个对象被强引用指向时,该对象被认为...

    十分钟理解Java中的弱引用编程开发技术共3页.pdf.z

    在Java中,`java.lang.ref`包提供了三种不同类型的引用:强引用(Strong Reference)、软引用(Soft Reference)和弱引用(Weak Reference)。我们主要关注弱引用,它通过`WeakReference`类来实现。弱引用对象在创建...

    10分钟带你理解Java中的弱引用

    Java中存在四种引用级别:强引用、软引用、弱引用和虚引用,弱引用位于这些级别中间,比软引用弱,比虚引用强。 1. 强引用(Strong Reference):最常见的引用类型,通过`new`关键字创建的对象引用即为强引用。只要...

    Java对象的引用.pdf

    从JDK1.2开始,Java引入了四种不同级别的引用,分别是强引用、软引用、弱引用和虚引用,每种引用类型都有其特定的用途和行为。 1. **强引用**:这是最常见的引用类型,如果一个对象被强引用,垃圾收集器永远不会...

    详解JAVA 虚引用

    如果一个对象没有强引用和软引用,对于垃圾回收器而言便是可以被清除的,在清除之前,会调用其finalize方法,如果一个对象已经被调用过finalize方法但是还没有被释放,它就变成了一个虚可达对象。 与软引用和弱引用...

    详解 JAVA 弱引用

    弱可达对象在垃圾回收器回收之前,WeakReference类所提供的get方法会返回其引用对象的强引用,一旦垃圾回收器回收掉该对象之后,get方法将返回null。因此,在获取弱引用对象的代码中,一定要判断是否为null,以免...

    详解Java对象的强、软、弱和虚引用+ReferenceQueue

    Java对象的强、软、弱和虚引用是Java语言中的一种机制,用于控制对象的生命周期和垃圾回收。下面是对Java对象的强、软、弱和虚引用的详细解释: 一、强引用(StrongReference) 强引用是使用最普遍的引用。如果一...

    Java引用类型1

    Java提供了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用(幻象引用),每种引用类型在内存管理中有不同的作用。 1. **强引用(Strong Reference)** - 强引用是最常见的引用类型,即通常的变量赋值。...

Global site tag (gtag.js) - Google Analytics