SoftReference, WeakReference 和 PhantomReference

一、为什么要有这些**Reference

以前一直没搞明白,java中对象直接本身就是传引用reference,不同于c++的可以指针也可以引用。但java.lang.ref包下面居然还专门定义了几个**Reference:SoftReference, WeakReference 和 PhantomReference。这几个类是干什么用的呢?为什么要专门定义这几种特殊的引用?

作为引用,当然都是指向其被引用的对象。但是不同于一般的引用(和这几种引用对照被称为强引用 Strong reference),定义为这几种类型的引用不防碍 Java 垃圾回收器对它们所指向的对象进行回收。即另个特征:1)保留了引用本身的基本要求,即保持对使用对象的引用;2)可以使 JVM在内存不够用的时候对使用对象进行回收

二、代码关系

这几个类都是定义在包java.lang.ref下面,都是public abstract class Reference<T>类的子类。

Reference-hierarchy

 

Reference-package

 

三、分别介绍

1.软引用 SoftReference

通过构造函数来构造引用。

即把一个T类型的对象通过构造函数传进来即可构造指向该对象的引用。

在要使用该对象时通过

方法获得被引用的对象。

即看上去SoftReference只是包装的一个壳儿。为什么要费劲加这个壳儿,而不是直接使用呢,原因就是前面讲到的这个类型的引用带来的好处:对于SoftReference 来说,该引用软引用所指向的对象按照 JVM 的使用情况(Heap 内存是否临近阈值)来决定是否回收。因此SoftReference可以避免引起内存不足的异常。?当垃圾回收器决定对其回收时,会先清空它的 SoftReference,也就是说 SoftReference 的 get() 方法将会返回 null,然后再调用对象的 finalize() 方法,并在下一轮 GC 中对其真正进行回收。

2.弱引用WeakReference

WeakReference 的构造和对象使用和SoftReference完全相同。

其区别在于gc时候的特征不同,WeakReference 在gc时候,不管内存情况怎么样,都会对其进行回收,因而也可以避免内存不足问题引起的异常。

3.虚引用PhantomReference

虚引用不能通过get方法获得饮用对象。因为其get方法的定义:

虚引用主要被用来?跟踪对象被垃圾回收的状态,通过查看引用队列中是否包含对象所对应的虚引用来判断它是否?即将被垃圾回收,标对象被回收前,它的引用会被放入一个 ReferenceQueue 对象中,从而达到跟踪对象垃圾回收的作用。

虚引用不会根据内存情况自动的垃圾回收,和普通股的引用对象一样,因而可能引起heap不够用。

?4.强引用StrongReference

其实Ref包中没有这个类,只是为了和上面三个**Reference对照。这就是我们一般的new出来存在heap上的引用。由gc的基本原理知道,当这个引用不再使用时,就会被回收掉。这种引用,其实我们一直在用,没有被**Reference这样的一个对象封装,也不用get()方法来解引用。new完了拿来用就是了。如果一个对象在被引用,则永远也不会被回收,因而可能导致内存泄露。

?四、总结对照

引用深入探讨 java.lang.ref 包的一个总结

引用类型 类型 取得目标对象方式 垃圾回收条件 是否可能内存泄漏 GC 后是否回收 创建大量对象时是否导致?Heap?不足异常 创建大量对象时是否导致?Heap?不足异常的运行结果
强引用 StrongReference 直接调用 不回收 可能 不回收 抛出异常 Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
软引用 SoftReference 通过 get() 方法 视内存情况回收 不可能 不回收 不抛异常,之前的引用自动清空并返回 null null
弱引用 WeakReference 通过 get() 方法 永远回收 不可能 回收 同上 null
虚引用 PhantomReference 无法取得 不回收 可能 N/A 抛出异常 Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

 

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: SoftReference, WeakReference 和 PhantomReference


, ,

No comments yet.

发表评论