一、前言:

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

除强引用外,其他3种引用均可以在java.lang.ref包种找到它们的身影,如下图,显示了这3种引用类型对应的类,开发人员可以在应用程序中直接使用它们。

Java 引用和调用 java的引用是什么_弱引用

二、四种引用:

Reference子类中只有终结器引用是包内可见的,其他3种引用类型均为public,可以在应用程序种直接使用。

强引用(StrongReference):最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj = new Object()” 这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。

软引用(SoftReference):在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出的异常。

弱引用(WeakReference):被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时,无论内存空间是否够用,都会回收掉被弱引用关联的对象。

虚引用(PhantomReference):一个对象是否存在虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

三、强引用:----------不回收

在Java程序中,最常见的引用类型是强引用(普通系统99%以上都是强引用),也就是我们最常见的普通对象引用,也是默认的引用类型。

当在Java语言中使用new操作符创建一个新的对象,并将其赋值给一个变量的时候,这个变量就成为指向该对象的一个强引用。

强引用的对象是可触及的,垃圾收集器就永远不会回收被引用的对象。

对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为null,就是可以当做垃圾收集被收集了,当然具体回收时机还是要看垃圾收集策略。

相对的,软引用,弱引用和虚引用的对象式软可触及、弱可触及、虚可触及的,在一定条件下,都是可以被回收的。所以,强引用式造成Java内存泄漏的主要原因之一。

例子:

Java 引用和调用 java的引用是什么_强引用_02

 发现str2 还能输出“hello word”;因为局部变量表中str2的引用没有断开。

四、软引用(SoftReference):-------内存不足时回收:

Java 引用和调用 java的引用是什么_弱引用_03

 

例子:

Java 引用和调用 java的引用是什么_弱引用_04

 

Java 引用和调用 java的引用是什么_弱引用_05

 五、弱引用(WeakReference):---------发现GC即回收:

Java 引用和调用 java的引用是什么_虚引用_06

 例子:

Java 引用和调用 java的引用是什么_虚引用_07

 

Java 引用和调用 java的引用是什么_虚引用_08

六、虚引用:---------------------对象回收跟踪

Java 引用和调用 java的引用是什么_虚引用_09

Java 引用和调用 java的引用是什么_弱引用_10

例子:

定义一个引用虚引用的队列和User 类:

Java 引用和调用 java的引用是什么_jvm_11

 

Java 引用和调用 java的引用是什么_弱引用_12

 

Java 引用和调用 java的引用是什么_强引用_13

 控制台输出:

Java 引用和调用 java的引用是什么_虚引用_14