面试官:说说Java对象的四种引用方式

栏目: Java · 发布时间: 7年前

内容简介:我们知道在Java中除了基础的数据类型以外,其它的都为引用类型。 而Java根据其生命周期的长短将引用类型又分为正常情况下我们平时基本上我们只用到强引用类型,而其他的引用类型我们也就在面试中,或者平日阅读类库或其他框架源码的时候才能见到。我们平日里面的用到的new了一个对象就是强引用,例如

我们知道在 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<Object> weakObj = new WeakReference<Object>(obj);
 obj = null; //去除强引用
复制代码

在GC的时候,不管内存空间足不足都会回收这个对象,同样也可以配合 ReferenceQueue 使用,也同样适用于内存敏感的缓存。 ThreadLocal 中的key就用到了弱引用。

4.幻象引用

也称虚引用,是通过 PhantomReference 类实现的。任何时候可能被GC回收,就像没有引用一样。

Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<Object> phantomObj = new PhantomReference<Object>(obj , queue);
obj = null; //去除强引用
复制代码

无法通过虚引用访问对象的任何属性或者函数。那就要问了要它有什么用?虚引用仅仅只是提供了一种确保对象被 finalize 以后来做某些事情的机制。比如说这个对象被回收之后发一个系统通知啊啥的。虚引用是必须配合 ReferenceQueue 使用的,具体使用方法和上面提到软引用的一样。主要用来跟踪对象被垃圾回收的活动。

如有错误欢迎指正!

个人公众号:yes的练级攻略

有相关面试进阶(分布式、性能调优、经典书籍pdf)资料等待领取


以上所述就是小编给大家介绍的《面试官:说说Java对象的四种引用方式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

周鸿祎自述

周鸿祎自述

周鸿祎 / 中信出版社 / 2014-8 / 45.00元

在很多方面,周鸿祎都是互联网领域的颠覆者。他重新定义了“微创新”,提出从细微之处着手,通过聚焦战略,以持续的创新,最终改变市场格局、为客户创造全新价值。他第一个提出了互联网免费安全的理念,也由此让奇虎360拥有了超过4亿的用户。 在《周鸿祎自述:我的互联网方法论》中,周鸿祎首次讲述了自己的互联网观、产品观和管理思想,厘清了互联网产品的本质特征和互联网时代的新趋势,列举了颠覆式创新在现实中的实......一起来看看 《周鸿祎自述》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具