Java引用分為強引用、軟引用、弱引用驹闰、虛引用晨雳。
強引用:是指在代碼中普遍存在的,類似“Object obj = new Object()”這類的引用紧卒,只要強引用存在侥衬,當(dāng)內(nèi)存不足發(fā)生GC時,寧拋出內(nèi)存溢出異常跑芳,也不會回收被強引用的對象轴总。
軟引用:是用來描述一些還有用但并非必需的對象。系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前博个,會把軟引用關(guān)聯(lián)的對象列進回收范圍進行第二次回收怀樟,如果這次回收還沒有足夠內(nèi)存,才會拋出內(nèi)存溢出異常盆佣。內(nèi)存夠用時不會被GC往堡。使用SoftReference類實現(xiàn)軟引用。適合做緩存共耍。
下例中g(shù)c之后虑灰,root.get()不為null。
弱引用:也是描述非必需對象痹兜,比軟引用弱瘩缆。弱引用的對象只能生存到下一次GC之前。當(dāng)發(fā)生GC時佃蚜,無論內(nèi)存是否足夠庸娱,弱引用關(guān)聯(lián)的對象都會被回收。使用WeakReference類實現(xiàn)弱引用谐算∈煳荆可用于緩存,Java中WeakHashMap運用了弱引用洲脂。
下例中發(fā)生gc后斤儿,root.get()為null剧包。
虛引用:也稱幽靈引用或幻影引用。對象是否有虛引用往果,不會對其生存時間有影響疆液,也不能通過虛引用取得對象的實例(它的get()方法總為null)。為對象設(shè)置虛引用關(guān)聯(lián)唯一的目的就是在這個對象被激勵回收器回收時收到一個系統(tǒng)通知陕贮。下次GC時會回收虛引用的對象堕油。使用PhantomReference類實現(xiàn)。
參考:
《深入理解JVM》
http://www.reibang.com/p/7200da8b043f ?