一般说来,如果物品已被扔到垃圾箱,想再 把它捡回来运用就不能够了。
但有时刻状况并不这么简朴,你能够会遇到相似鸡肋一样的物品,食之无味,弃之可惜。这类物品如今已无用了,保存它会占空间,然则立时抛弃它也不划算,因 为或许未来还会派用处。关于如许的无足轻重的物品,一种折中的处置惩罚方法是:如果家里空间充足,就先把它保存在家里,如果家里空间不够,纵然把家里一切的垃 圾消灭,照样没法包容那些必不可少的生活用品,那末再抛弃这些无足轻重的物品。
从JDK1.2版本最先,把对象的援用分为四种级别,从而使顺序能越发天真的掌握对象的生命周期。这四种级别由高到低依次为:强援用、软援用、弱援用和虚援用。
1.强援用
本章前文引见的援用实际上都是强援用,这是运用最广泛的援用。如果一个对象具有强援用,那就相似于必不可少的生活用品,垃圾接纳器绝不会接纳它。当内存空 间不足,java虚拟机情愿抛出OutOfMemoryError毛病,使顺序非常停止,也不会靠随便接纳具有强援用的对象来处理内存不足题目。
2.软援用(SoftReference)
如果一个对象只具有软援用,那就相似于可有可物的生活用品。如果内存空间充足,垃圾接纳器就不会接纳它,如果内存空间不足了,就会接纳这些对象的内存。只需垃圾接纳器没有接纳它,该对象就能够被顺序运用。软援用可用来完成内存敏感的高速缓存。
软援用能够和一个援用行列(ReferenceQueue)团结运用,如果软援用所援用的对象被垃圾接纳,Java虚拟机就会把这个软援用加入到与之关联的援用行列中。
3.弱援用(WeakReference)
如果一个对象只具有弱援用,那就相似于可有可物的生活用品。弱援用与软援用的辨别在于:只具有弱援用的对象具有更短暂的生命周期。在垃圾接纳器线程扫描它 所统领的内存地区的过程当中,一旦发明了只具有弱援用的对象,不论当前内存空间充足与否,都邑接纳它的内存。不过,因为垃圾接纳器是一个优先级很低的线程, 因而不一定会很快发明那些只具有弱援用的对象。
弱援用能够和一个援用行列(ReferenceQueue)团结运用,如果弱援用所援用的对象被垃圾接纳,Java虚拟机就会把这个弱援用加入到与之关联的援用行列中。
4.虚援用(PhantomReference)
"虚援用"望文生义,就是形同虚设,与其他几种援用都差别,虚援用并不会决议对象的生命周期。如果一个对象仅持有虚援用,那末它就和没有任何援用一样,在任何时刻都能够被垃圾接纳。
虚援用重要用来跟踪对象被垃圾接纳的运动。虚援用与软援用和弱援用的一个辨别在于:虚援用必需和援用行列(ReferenceQueue)团结运用。当垃 圾接纳器准备接纳一个对象时,如果发明它还有虚援用,就会在接纳对象的内存之前,把这个虚援用加入到与之关联的援用行列中。顺序能够经由过程剖断援用行列中是 否已加入了虚援用,来相识
被援用的对象是不是将要被垃圾接纳。顺序如果发明某个虚援用已被加入到援用行列,那末就能够在所援用的对象的内存被接纳之前采用必要的行为。
在本书中,"援用"既能够作为动词,也能够作为名词,读者应当依据上下文来辨别"援用"的寄义。
在java.lang.ref包中供应了三个类:SoftReference类、WeakReference类和PhantomReference类,它 们离别代表软援用、弱援用和虚援用。ReferenceQueue类示意援用行列,它能够和这三种援用类团结运用,以便跟踪Java虚拟机接纳所援用的对 象的运动。以下顺序建立了一个String对象、ReferenceQueue对象和WeakReference对象:
//建立一个强援用
String str = new String("hello");
//建立援用行列, <String>为范型标记,表明行列中寄存String对象的援用
ReferenceQueue<String> rq = new ReferenceQueue<String>();
//建立一个弱援用,它援用"hello"对象,而且与rq援用行列关联
//<String>为范型标记,表明WeakReference会弱援用String对象
WeakReference<String> wf = new WeakReference<String>(str, rq);
以上就是Java对象的强、软、弱和虚援用的内容,更多相关内容请关注ki4网(www.ki4.cn)!