Java垃圾回收机制详解:四种引用类型及其应用场景分析
Java垃圾回收与引用类型

Java 的垃圾回收器会把未被使用的对象内存进行释放。引用类型的设计目的是能够更好地与这一机制相配合。在 Java 中,垃圾回收器会自动去释放那些已经不再被程序所使用的对象的内存。四是虚引用(Phantom Reference)。
强引用(Strong Reference)
强引用在 Java 中是最为普遍的引用类型。它能确保对象不被垃圾回收,除非引用被明确置为 null。在 Java 程序里,强引用很常见。当一个对象被强引用关联时,即便系统内存紧张,该对象也不会被垃圾回收器自动回收。这种引用保证了对象在程序中的可访问性,只要强引用一直存在,对象就能长久保留。
以下是一个简单的示例:
创建了一个新的 Object 对象,然后通过 Object obj = new Object(); 这行代码,用一个强引用指向了这个新创建的 Object 对象。
在此代码里,obj 属于强引用。只要此引用未被明确置为 null ,也未自身被回收,那么它所指向的 Object 对象就不会被垃圾回收器清理。
软引用(Soft Reference)
软引用的对象在内存不足时会被再次回收。软引用适用于内存敏感的缓存场景。软引用顾名思义,是对一些可能有用但并非不可或缺的对象的引用。这类引用与垃圾回收器关系紧密。当系统内存不足时,这些对象的内存会被垃圾回收器第二次回收。只有在这次回收后仍无法释放足够内存时,才会抛出内存溢出异常。软引用特别适用于需要实现内存敏感缓存的场景。
以下是一个关于软引用的简单示例:
SoftReference
在这个例子里,softReference 是一种软引用,它所指向的是一个新创建出来的 Object 对象。当系统内存处于紧张状态时,垃圾回收器会试着去回收这个对象。不过,在这之前,这个对象依然能够通过 softReference.get() 方法来进行访问。
弱引用(Weak Reference)
弱引用的对象在进行垃圾收集时会立刻被回收,不管内存处于何种状态。弱引用相较于软引用,是对非必需对象更弱的一种描述。其特点是,被弱引用所关联的对象只能存活到下一次垃圾收集活动来临之前。当垃圾收集器工作时,不管当前内存是否紧张,都会对那些仅被弱引用关联的对象进行回收。
以下是一个关于弱引用的简单示例:
WeakReference
在这个例子里,有一个弱引用叫 weakReference,它指向了一个新创建的 Object 对象。不过,和软引用不一样的是,当垃圾回收器运行时,这个对象有可能会立刻被回收,不管系统当前的内存状况是怎样的。
虚引用(Phantom Reference)
虚引用的作用是在对象被回收时能收到通知,并且要与引用队列联合使用。虚引用是引用关系里最弱的一种。一个对象有没有虚引用,都不会对它的生命周期造成影响。通过虚引用没办法获取到对象的实例,它唯一的作用就是在对象被垃圾回收时收到系统的通知。而且虚引用必须和引用队列(ReferenceQueue)一起使用。
以下是一个关于虚引用的示例:
ReferenceQueue
在这个例子里,phantomReference 是一种虚引用。它指向了一个新创建出来的 Object 对象,并且和一个引用队列 queue 有联系。当这个对象被垃圾回收器进行回收的时候,这个虚引用就会被添加到引用队列当中。然而,它并不能阻止对象被回收。通过对引用队列进行检查,我们就能够知晓对象在什么时候被回收了。