对象的引用
对象的引用分为了四个级别,从高到低为强引用、软引用、弱引用和虚引用
引用类型都是java.lang.ref.Reference类的子类
强引用
最普遍的引用,如果一个对象具有强引用,就类似于生活必需品,垃圾回收器绝对不会回收它,当内存空间不足,java虚拟机宁愿抛出OutOfMemeryError错误,使程序异常终止,也不会随意回收具有强引用的对象来解决内存不足的问题
当使用new来实例化一个对象并将其赋给一个变量的时候,这个变量就成为了指向这个对象的引用
软引用(SoftReference)
一个对象具有软引用,类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果空间内存不足,就会回收这些对象,可以用软引用来实现内存敏感的高速缓存。
1 | TestRef obj = new TestRef(); |
可以和引用队列联合使用,如果软引用所引用的对象被垃圾回收,java虚拟机会将这个软引用加入到与之关联的引用队列中
弱引用(WeakReference)
一个对象具有弱引用,也类似于可有可无的生活用品。弱引用和软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描内存区域时,一旦发现了只具有弱引用的对象,不管当前内存是否足够,都会进行回收。
可以和引用队列联合使用,如果弱引用所引用的对象被垃圾回收,java虚拟机会将这个弱引用加入到与之关联的引用队列中
虚引用(PhantomReference)
虚引用,顾名思义,就是形同虚设,与前面的几个都不相同,虚引用不会决定对象的生命周期,如果一个对象仅持有虚引用,就和没有任何引用一样,任何时候都可以被垃圾回收器回收。
虚引用主要用于跟踪对象被垃圾回收的活动。虚引用与弱引用的区别在于,虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器回收一个对象时,如果发现它有虚引用,在回收对象之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过引用队列中是否加入了虚引用,来了解被引用的对象是否将要被垃圾回收。