? ? ? ? 根據(jù)上篇文章可知垃圾收集--判斷對(duì)象是否存活 - 簡(jiǎn)書(shū),判斷對(duì)象是否存活和“引用”有關(guān)。
? ? ? ? 在JDK1.2之前,對(duì)于引用的定義很狹隘:如果引用類型的數(shù)據(jù)中存儲(chǔ)的數(shù)值代表的是另外一塊內(nèi)存的起始地址,就成這塊內(nèi)存代表一個(gè)引用。(即只有引用或沒(méi)被引用兩種狀態(tài))。但這種定義對(duì)于在當(dāng)內(nèi)存空間還足夠的時(shí)候想保留,不足時(shí)想釋放的釋放的對(duì)象來(lái)說(shuō)就無(wú)法控制。
? ? ? ?所以,Java對(duì)引用的定義進(jìn)行了擴(kuò)充,將引用分為了四類:強(qiáng)引用、軟引用、弱引用、虛引用。這四種引用強(qiáng)度依次減弱。
(1)強(qiáng)引用:程序代碼中普遍存在的,類似于“object obj = new Object()”這類引用,只要強(qiáng)引用還存在,垃圾收集器永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象。
(2)軟引用:用來(lái)描述一些還有用,但非必需的對(duì)象。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會(huì)把這些對(duì)象列入回收范圍之中并進(jìn)行第二次回收。如果這次回收還是沒(méi)有足夠的內(nèi)存,才會(huì)拋出內(nèi)存溢出的異常。(JDK提供SoftReference類來(lái)實(shí)現(xiàn)軟引用)
(3)弱引用:弱引用也是用來(lái)描述非必需對(duì)象的,它的程度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對(duì)象只能存活到下一次垃圾收集發(fā)生之前。當(dāng)垃圾收集器工作時(shí),無(wú)論當(dāng)前內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象。(JDK提供WeakReference類來(lái)實(shí)現(xiàn)軟引用)
(4)虛引用:是一種最弱的引用關(guān)系。一個(gè)對(duì)象是否有虛引用的存在,完全不會(huì)對(duì)其生存時(shí)間構(gòu)成影響,也無(wú)法通過(guò)虛引用來(lái)取得一個(gè)對(duì)象實(shí)例。而為一個(gè)對(duì)象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是希望這個(gè)對(duì)象被收集器回收時(shí)能收到一個(gè)系統(tǒng)通知。