8.1 Java 中的弱引用

Java 中有多种引用。

StrongReference - 这些是我们每天创建的最常见的链接。

Object object = new Object();//created an object
object = null;//can now be garbage collected

并且存在三种“特殊”类型的链接——SoftReference、WeakReference、PhantomReference。事实上,所有类型的链接之间只有一个区别 - GC 的行为及其所引用的对象。稍后我们将更详细地讨论每种链接类型的细节,但就目前而言,以下知识就足够了:

  • SoftReference是一种软引用,如果 GC 发现一个对象只能通过一系列软引用访问,那么它将把它从内存中移除。或许。
  • WeakReference - 弱引用,如果 GC 发现一个对象只能通过弱引用链访问,那么它将把它从内存中移除。
  • PhantomReference是一个幻影引用,如果 GC 发现一个对象只能通过幻影引用链获得,那么它将把它从内存中移除。经过几次 GC。

您也可以说链接类型具有一定程度的柔软性:

  • 常规硬链接是引用类型的任何变量。在未使用之前未被垃圾收集器清理。
  • 软参考。该对象不会导致所有内存用完 - 它保证在 OutOfMemoryError 发生之前被删除。可能更早,这取决于垃圾收集器的实现。
  • 弱引用。软弱一些。不阻止对象被处理;垃圾收集器忽略此类引用。
  • 幻影参考。用于对象的“死亡”处理:对象在终结后可用,直到被垃圾回收。

如果尚不清楚区别是什么,请不要担心,很快一切都会水到渠成。细节在细节中,细节在后面。

8.2 Java 中的弱引用和软引用

首先我们来看一下Java中的弱引用软引用的区别。

简而言之,如果只有弱引用指向对象,垃圾收集器将释放该对象的内存。如果对象由 SoftReferences 指向,那么当 JVM 急需内存时,内存将被释放。

在某些情况下,这使SoftReference比 Strong reference具有明显的优势。例如,SoftReference 用于实现应用程序缓存,因此 JVM 要做的第一件事就是删除只有 SoftReferences 指向的对象。

WeakReference非常适合存储元数据,例如存储对 ClassLoader 的引用。如果没有加载任何类,则不应引用 ClassLoader。这就是为什么 WeakReference 使得垃圾收集器可以在对它的最后一个强引用被删除后立即在 ClassLoader 上完成它的工作。

Java 中的弱引用示例:

// some object
Student student = new Student();

// weak reference to it
WeakReference weakStudent = new WeakReference(student);

// now the Student object can be garbage collected
student = null;

Java 中的软引用示例:

// some object
Student student = new Student();

// weak reference to it
SoftReference softStudent = new SoftReference(student)

// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;

8.3 Java 中的 PhantomReference

PhantomReference 实例的创建方式与 WeakReference 和 SoftReference 示例中的相同,但很少使用。

如果对象没有强引用 (Strong)、弱引用 (WeakReference) 或软引用 (SoftReference),则 PhantomReference 可以被垃圾回收。

您可以像这样创建一个 Phantom Reference 对象:

PhantomReference myObjectRef = new PhantomReference(MyObject);

PhantomReference可用于 finalize() 没有意义的情况。此引用类型与其他类型不同,因为它不是为访问对象而设计的。这是一个信号,表明该对象已经完成并且垃圾收集器已准备好回收其内存。

为此,垃圾收集器将它放在一个特殊的ReferenceQueue中以供进一步处理。ReferenceQueue 是放置对象引用以释放内存的地方。

幻象引用是一种安全的方式来知道一个对象已经从内存中移除。例如,考虑一个处理大图像的应用程序。假设我们想要在内存中已经准备好进行垃圾回收的图像时将其加载到内存中。在这种情况下,我们希望在将新图像加载到内存之前等待垃圾收集器杀死旧图像。

这里 PhantomReference 是一个灵活而安全的选择。旧图像对象被销毁后,旧图像的引用将传递给 ReferenceQueue。一旦我们有了这个链接,我们就可以将新图像加载到内存中。

undefined
3
Опрос
Working with memory in Java,  18 уровень,  7 лекция
недоступен
Working with memory in Java
Working with memory in Java