持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情
Java体系中的几种引用
在java中,对于引用对象这个词,相信大家都不觉得陌生了;但是有没有了解过它其中的几种引用呢?
不管有没有了解过都不要紧,因为我们这一次就是来一起学习java中的几种引用相关的知识点的。
话不多说,咱们马上开始!
引用分为哪几种?
在java中引用分为以下几种:
- 强引用(StrongReference )
- 软引用(SoftReference )
- 弱引用:(WeakReference )
- 虚引用:(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体系中的四种引用,分别是强引用、软引用、弱引用、虚引用。