强引用、软引用、弱引用、幻象引用有什么区别?
这道面试题,属于既偏门又非常高频的一道题目,需要好好的记录一下。
不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响
- 强引用:
我们常用的编码如:Object obj = new Object();中的obj就是强引用,通过关键字new创建的普通对象都是强引用
只要强引用指向一个对象,就能表明对象还存在,垃圾收集器就不会碰这种对象
对于一个普通的对象,如果没有其他的引用关系,只要超出了引用的作用域或者显示的将强引用赋值为null,就可以被垃圾回收收集了
- 软引用
软引用生命周期比强引用短一些
当JVM认为内存不足时,会去试图回收软引用指向对象
如果JVM认为内存空闲,会暂时保留软引用
- 弱引用
弱引用的生命周期比软引用更短,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,无论当前内存空间是否不足,都会回收它的内存
- 幻象引用
幻象引用也叫虚引用
幻象引用用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用