面试官:详细谈谈Java对象的4种引用方式
前言
我们知道在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 使用的,具体使用方法和上面提到软引用的一样。主要用来跟踪对象被垃圾回收的活动。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。
您可能感兴趣的文章:
- Java语言对对象引用的4种方式
- Java语言对对象引用的4种方式
- Java语言对对象引用的4种方式
- 从JVM内存管理的角度谈谈静态方法和静态属性 和 java对象引用与JVM自动内存管理
- Java String对象以“引用”方式被传递
- 从JVM内存管理的角度谈谈静态方法和静态属性 和 java对象引用与JVM自动内存管理
- Java创建对象的4种方式?
- 黑马程序员-Java_另类理解多态AND理解父类引用指向子类对象的方式
- Java对象内存存储,引用传递,值传递详细图解
- 2018/01/08JAVA 基础 / 接口与继承/Java关键词:变量引用 super 调用父类对象方法/构造方法【或者访问父类对象属性】的方式归纳
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- java学习个人笔记---java内存管理之Java对象的引用方式
- Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用
- Java对象与JVM(三) Java对象在Java虚拟机中的引用访问方式
- Java 对象的4种引用类型
- 从JVM内存管理的角度谈谈静态方法和静态属性 和 java对象引用与JVM自动内存管理
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- 从JVM内存管理的角度谈谈静态方法和静态属性 和 java对象引用与JVM自动内存管理
- JAVA创建对象的4种方式
- 第001弹:Java 中创建对象的4种方式