1.強(qiáng)引用
一般的Object obj = new Object() ,就屬于強(qiáng)引用。在任何情況下,只要有強(qiáng)引用關(guān)聯(lián)(與根可達(dá))還在,垃圾回收器就永遠(yuǎn)不會回收掉被引用的對象。
根可達(dá):根節(jié)點可達(dá)。
根節(jié)點有哪些
a.虛擬機(jī)棧(棧幀中的本地變量表)中引用的對象。
b.方法區(qū)中類靜態(tài)屬性引用的對象。
c. 方法區(qū)中常量引用的對象。
d.本地方法棧中JNI(即一般說的Native方法)引用的對象。
e. JVM的內(nèi)部引用(class對象、異常對象NullPointException、OutofMemoryError,系統(tǒng)類加載器)。
f. 所有被同步鎖(synchronized關(guān)鍵)持有的對象。
g. JVM內(nèi)部的JMXBean、JVMTI中注冊的回調(diào)、本地代碼緩存等
h.JVM實現(xiàn)中的“臨時性”對象,跨代引用的對象(在使用分代模型回收只回收部分代時)。
2.軟引用SoftReference
一些有用但是并非必需,用軟引用關(guān)聯(lián)的對象,系統(tǒng)將要發(fā)生內(nèi)存溢出(OuyOfMemory)之前,這些對象就會被回收(如果這次回收后還是沒有足夠的空間,才會拋出內(nèi)存溢出)。
3.弱引用WeakReference
一些有用(程度比軟引用更低)但是并非必需,用弱引用關(guān)聯(lián)的對象,只能生存到下一次垃圾回收之前,GC發(fā)生時,不管內(nèi)存夠不夠,都會被回收。比如ThreadLocal、WeakHashMap的使用。一般弱引用比軟引用用得多。
4.虛引用PhantomReference
幽靈引用,最弱(隨時會被回收掉)。垃圾回收的時候收到一個通知,就是為了監(jiān)控垃圾回收器是否正常工作。