Java体系中的几种引用

80 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情

Java体系中的几种引用

在java中,对于引用对象这个词,相信大家都不觉得陌生了;但是有没有了解过它其中的几种引用呢?

不管有没有了解过都不要紧,因为我们这一次就是来一起学习java中的几种引用相关的知识点的。

话不多说,咱们马上开始!

引用分为哪几种?

在java中引用分为以下几种:

  1. 强引用(StrongReference )
  2. 软引用(SoftReference )
  3. 弱引用:(WeakReference )
  4. 虚引用:(PhantomReference)

它们当中最大的区别,或则影响就是在垃圾回收的时候了。

强引用(StrongReference )

什么是强引用呢?

下面我们一起来看看代码:

Object o = new Object();

上述代码中建立的就是一个强引用,o指向于新创建的Object对象。

在强引用下,就算是系统垃圾回收(gc),也不会回收的;哪怕已经超出了内存最大限度,这时候JVM会直接抛出异常OOM(内存溢出),而不是回收刚刚强引用所指向的对象。

软引用(SoftReference )

什么是软引用呢?

下面我们一起来看看代码:

 SoftReference<byte[]> m = new SoftReference<>(new byte[1024*1024*10]);

上面就创建了一个软引用,m软引用指向byte数组。

在软引用的情况下,一般不会被垃圾回收(gc),除非当前内存即将超出最大限度了,为了避免抛出OOM(内存溢出)异常,这时候就会回收软引用指向的对象。

弱引用:(WeakReference )

什么是弱引用呢?

下面我们一起来看看代码:

 WeakReference<M> m = new WeakReference<>(new M());

上面就创建了一个软引用,m弱引用指向M对象。

只有弱引用指向的对象,在gc时是会毫不犹豫地被回收的。

虚引用:(PhantomReference)

什么是虚引用呢?

下面我们一起来看看代码:

    private static final List<Object> LIST = new LinkedList<>();
    private static final ReferenceQueue<M> QUEUE = new ReferenceQueue<>();
    ...
    PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);

其实虚引用是指向于直接内存的,JVM内部的gc无法回收,而这时候是会将虚引用加进QUEUE队列里,当QUEUE里有数据的时候,就会触发直接内存的释放(回收)。

总结

这次我们主要介绍了java体系中的四种引用,分别是强引用、软引用、弱引用、虚引用。