强软弱虚四种引用介绍

文章目录

    • 1.概述
    • 2.强引用
    • 3.软引用
    • 4.弱引用
    • 5.虚引用

1.概述

引用计数算法和可达性分析算法,都可以判断对应是否存活,判断对象是否存活都和“引用相关”。JDK1.2之前,reference存储的是一块内存的其实地址,一个对象在这种定义下只有被引用和没有被引用。当我们需要描述这样一种对象,如果空间内存足够时,保留在内存中;如果内存空间再进行垃圾收集之后还是非常紧张,则可以抛弃这些对象。比如缓存就很符合这样的应用场景。

JDK1.2之后,Java对引用的概念进行了扩充,分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4中,这4种引用强度逐渐减弱。

2.强引用

强引用就是普通的引用,类似“Object obj = new Object()”,只要强引用还存在,垃圾回收器就永远不会回收掉被引用的对象。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

3.软引用

软引用(SoftReference)在强度上弱于强引用,通过类SoftReference来表示。它的作用是告诉垃圾回收器,程序中的哪些对象是不那么重要,当内存不足的时候是可以被暂时回收的。当JVM中的内存不足的时候,垃圾回收器会释放那些只被软引用所指向的对象。如果全部释放完这些对象之后,内存还不足,才会抛出OutOfMemory错误。软引用非常适合于创建缓存。当系统内存不足的时候,缓存中的内容是可以被释放的。

4.弱引用

弱引用(WeakReference)也是用来非必须的对应的,它比软引用更弱一些,只被弱引用关联的对象,当垃圾回收器工作时,无论当前内存是否足够,这些植被弱引用关联的对象都会被回收掉。

弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用最常见的用处是在集合类中,尤其在哈希表中。哈希表的接口允许使用任何Java对象作为键来使用。当一个键值对被放入到哈希表中之后,哈希表对象本身就有了对这些键和值对象的引用。如果这种引用是强引用的话,那么只要哈希表对象本身还存活,其中所包含的键和值对象是不会被回收的。如果某个存活时间很长的哈希表中包含的键值对很多,最终就有可能消耗掉JVM中全部的内存。

对于这种情况的解决办法就是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。Java中提供了WeakHashMap来满足这一常见需求。

5.虚引用

虚引用(PhantomReference)也称为幽灵引用或者幻影引用,最弱的一种引用,甚至无法通过虚引用来获取一个对象的实例。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响。为一个对应设置虚引用关联的唯一目的就是能在这个对应被收集器回收时收到一个系统通知。虚引用必须和引用队列 (ReferenceQueue)联合使用。

你可能感兴趣的:(JVM)