java面试题(杨晓峰)---第四讲强引用、软引用、弱引用、幻想引用有什么区别?

时间:2024-01-18 14:25:50

在java语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握java对象生命周期和JVM内部相关机制非常有帮助。

今天问题:强引用、软引用、弱引用、幻想引用有什么区别?具体使用场景是什么?

经典回答:不同的引用类型,主要体现的是对象不同的可达性状态和对垃圾收集的影响。

强引用特点:我们平常典型编码Object obj=new Object()中obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM)使程序异常终止,也不会考随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显示的将相应(强)引用赋值为null,就可以被垃圾收集了,具体回收时机还要看收集策略。

软引用特点:软引用通过SoftReference类实现。软引用的生命周期比强引用短一些。只有JVM认为内存不足时,才会试图回收软引用指向的对象。软引用可以和一个引用队列联合使用。如果软引用所引用的对象被垃圾回收器回收,java虚拟机就会把这个软引用加到与之关联的引用队列中。后续可以调用poll()方法检查是否有他关心的对象被回收,空返回null,否则返回队列中前一个reference对象。

应用场景:软引用用来存储内存敏感的缓存。如果还有空闲内存,就可以暂时保存缓存,当内存不足时清理掉,这样就保证了使用缓存的同时不会耗尽内存。

弱引用特点:当垃圾回收器扫描他所管辖的内存区域时,一旦发现了弱引用的对象不管内存空间是否充足,都回收他的内存。

应用场景:弱引用同样适用于内存敏感的缓存。

虚引用、幻想引用特点;无法通过虚引用访问对象的任何属性或者函数

应用场景:用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。