面试指导:Java物件的四种引用方式 面试碰到怎么说?

我们知道在Java中除了基础的资料型别以外,其它的都为引用型别。 而Java根据其生命周期的长短将引用型别又分为 强引用、软引用、弱引用、幻象引用 。
正常情况下我们平时基本上我们只用到强引用型别,而其他的引用型别我们也就在面试中,或者平日阅读类库或其他框架源代码的时候才能见到。
1.强引用
我们平日里面的用到的new了一个物件就是强引用,例如 Object obj = new Object(); 当JVM的内存空间不足时,宁愿丢掷OutOfMemoryError使得程式异常终止也不愿意回收具有强引用的存活着的物件 !记住是存活着,不可能是你new一个物件就永远不会被GC回收。当一个普通物件没有其他引用关系,只要超过了引用的作用域或者显示的将引用赋值为null时,你的物件就表明不是存活着,这样就会可以被GC回收了。当然回收的时间是不一定的具体得看GC回收策略。
2.软引用
软引用的生命周期比强引用短一些。软引用是通过 SoftReference 类实现的。Object obj = new Object();
SoftReference softObj = new SoftReference(obj);
obj = null; //去除强引用
这样就是一个简单的软引用使用方法。通过 get() 方法获取物件。当JVM认为内存空间不足时,就回去试图回收软引用指向的物件,也就是说在JVM丢掷 OutOfMemoryError 之前,会去清理软引用物件。软引用可以与引用伫列 (ReferenceQueue) 联合使用。
Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
SoftReference softObj = new SoftReference(obj,queue);
obj = null; //去除强引用
当 softObj 软引用的 obj 被GC回收之后, softObj 物件就会被塞到 queue 中,之后我们可以通过这个伫列的 poll() 来检查你关心的物件是否被回收了,如果伫列为空,就返回一个 null。反之就返回软引用物件也就是 softObj 。
软引用一般用来实现内存敏感的快取,如果有空闲内存就可以保留快取,当内存不足时就清理掉,这样就保证使用快取的同时不会耗尽内存。例如图片快取框架中快取图片就是通过软引用的。
3.弱引用
弱引用是通过 WeakReference 类实现的,它的生命周期比软引用还要短,也是通过 get() 方法获取物件。Object obj = new Object();
WeakReference weakObj = new WeakReference(obj);
obj = null; //去除强引用
在GC的时候,不管内存空间足不足都会回收这个物件,同样也可以配合 ReferenceQueue 使用,也同样适用于内存敏感的快取。 ThreadLocal 中的key就用到了弱引用。
4.幻象引用
也称虚引用,是通过 PhantomReference 类实现的。任何时候可能被GC回收,就像没有引用一样。Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference phantomObj = new PhantomReference(obj , queue);
obj = null; //去除强引用
无法通过虚引用访问物件的任何属性或者函式。那就要问了要它有什么用?虚引用仅仅只是提供了一种确保物件被 finalize 以后来做某些事情的机制。比如说这个物件被回收之后发一个系统通知啊啥的。虚引用是必须配合 ReferenceQueue 使用的,具体使用方法和上面提到软引用的一样。主要用来跟踪物件被垃圾回收的活动。
小编在这里为大家准备了一些适合于1-5年以上开发经验的程序员面试涉及到的绝大部分面试题及答案做成了文件和学习笔记档案以及架构视讯资料免费分享给大家,希望可以帮助到大家。
获取方式:私信小编“学习”免费获取,记得转发+关注

