? ? ? ? 根據(jù)上篇文章可知垃圾收集--判斷對象是否存活 - 簡書尝蠕,判斷對象是否存活和“引用”有關(guān)烘豌。
? ? ? ? 在JDK1.2之前醇蝴,對于引用的定義很狹隘:如果引用類型的數(shù)據(jù)中存儲的數(shù)值代表的是另外一塊內(nèi)存的起始地址,就成這塊內(nèi)存代表一個引用奋早。(即只有引用或沒被引用兩種狀態(tài))犬庇。但這種定義對于在當(dāng)內(nèi)存空間還足夠的時候想保留,不足時想釋放的釋放的對象來說就無法控制更耻。
? ? ? ?所以,Java對引用的定義進(jìn)行了擴(kuò)充,將引用分為了四類:強引用序矩、軟引用、弱引用跋破、虛引用簸淀。這四種引用強度依次減弱。
(1)強引用:程序代碼中普遍存在的毒返,類似于“object obj = new Object()”這類引用租幕,只要強引用還存在,垃圾收集器永遠(yuǎn)不會回收掉被引用的對象拧簸。
(2)軟引用:用來描述一些還有用劲绪,但非必需的對象。對于軟引用關(guān)聯(lián)著的對象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前贾富,將會把這些對象列入回收范圍之中并進(jìn)行第二次回收歉眷。如果這次回收還是沒有足夠的內(nèi)存,才會拋出內(nèi)存溢出的異常颤枪。(JDK提供SoftReference類來實現(xiàn)軟引用)
(3)弱引用:弱引用也是用來描述非必需對象的汗捡,它的程度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對象只能存活到下一次垃圾收集發(fā)生之前畏纲。當(dāng)垃圾收集器工作時扇住,無論當(dāng)前內(nèi)存是否足夠,都會回收掉只被弱引用關(guān)聯(lián)的對象盗胀。(JDK提供WeakReference類來實現(xiàn)軟引用)
(4)虛引用:是一種最弱的引用關(guān)系台囱。一個對象是否有虛引用的存在,完全不會對其生存時間構(gòu)成影響读整,也無法通過虛引用來取得一個對象實例簿训。而為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是希望這個對象被收集器回收時能收到一個系統(tǒng)通知。