只知道new?Java中存在4种引用

我们经常通过new来创建对象。

实际上,指向new的引用,也可以称为“强引用”,如下中的ref,就是一个强引用。

Object ref = new Object();

强引用是我们最常使用的引用类型,也是四种引用级别中最高的一个。

 

四种引用,以及它们的强弱关系如下。

强引用>软引用>弱引用>虚引用

 

1.强引用

强引用,强在哪里?强在“JVM即使内存溢出,也不会让GC去随便的回收强引用对象所占用的内存空间”。其原因也容易理解,如果GC将上述的ref回收了,那么new Object()这个对象将毫无意义,后续所有使用ref的代码也将出错。

强引用,什么时候会失效?只有当强引用的值被置为 null 或作用域失效后,GC才会将强引用对象纳入被回收的范围。

 

2.软引用

当JVM的内存足够时,GC对待软引用和强引用的方式是一样,即不会主动回收软引用对象;但当JVM的内存不足时,GC就会去主动回收软引用对象。

也可以这么理解:JVM只会在抛出OutOfMemory之前回收软引用对象。

强引用可以直接通过关键字new产生,而软引用需要借助JDK提供的java.lang.ref.SoftReference

在软引用、弱引用和后面要讲的虚引用中都有一个get()方法(实际都是继承父类Reference而来),此方法用于获取引用所指向的引用对象。如下,就是通过get()方法获取了软引用所指向的ObjectDemo对象。

class ObjectDemo {
   public void method(){}
}

public class ReferenceDemo {
   public static void main(String[] args) throws Exception {
       SoftReference softReference = new SoftReference<>(new ObjectDemo());
       ObjectDemo obj =  softReference.get();
  }
}

 

3.弱引用

弱引用在JDK中是指java.lang.ref.WeakReference类。当GC进行垃圾回收时,无论是否当时JVM的内存是否充足,都会去主动回收弱引用对象。

 

4.虚引用

虚引用在JDK中是指java.lang.ref.PhantomReference类,虚引用也称为幻影引用或幽灵引用。虚引用是所有引用级别中最低的一个,甚至于“是否使用虚引用对于一个对象本身来说都没有任何区别”,并且我们也无法通过虚引用来获取一个对象实例。虚引用一般会和引用队列(ReferenceQueue)一起使用,其价值在于:当GC在回收某个对象时,如果发现这个对象还存在虚引用,就会在回收此对象前先把这个虚引用存放到相应的引用队列中,并且在这个虚引用出队前,不会回收对应的虚引用对象。因此,我们可以通过分析引用队列中虚引用的数量,来估算GC回收的频率,或者赶在虚引用对象在被回收前进行一些额外的操作。

 

本文引用了 慕课专栏《如何设计一个Java秒杀系统》,作者:颜群,

原文地址:http://www.imooc.com/read/56  (点击左下角“阅读原文”直达)

你可能感兴趣的:(JAVA)