Java虛擬機(jī)5:Java垃圾回收(GC)機(jī)制詳解一文中,有簡(jiǎn)單提到過(guò)JVM的四種引用狀態(tài),當(dāng)時(shí)只是簡(jiǎn)單學(xué)習(xí),知道有這么一個(gè)概念,對(duì)四種引用狀態(tài)理解不深。這兩天重看虛擬機(jī)這部分的時(shí)候,寫(xiě)了很多例子詳細(xì)研究了一下JVM的幾種引用,對(duì)于JVM的引用理解加深了不少,因此總結(jié)寫(xiě)一篇文章總結(jié)并分享下。

首先,還是先從JVM四種引用狀態(tài)開(kāi)始,這部分摘抄自周志明老師的《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》一書(shū)。

在JDK1.2之前,Java中的引用的定義很傳統(tǒng):如果reference類型的數(shù)據(jù)中存儲(chǔ)的數(shù)值代表的是另外一塊內(nèi)存的起始地址,就稱這塊內(nèi)存代表著一個(gè)引用。這種定義很純粹,但是太過(guò)狹隘,一個(gè)對(duì)象在這種頂一下只有被引用或者沒(méi)有被引用兩種狀態(tài),對(duì)于如何描述一些"食之無(wú)味,棄之可惜"的對(duì)象就顯得無(wú)能為力。我們希望能描述這樣一類對(duì)象:當(dāng)內(nèi)存空間還足夠時(shí),則能保留在內(nèi)存之中;如果內(nèi)存空間在進(jìn)行垃圾收集后還是非常緊張,則可以拋棄這些對(duì)象(注意和前面一段藍(lán)字的對(duì)比學(xué)習(xí))。很多系統(tǒng)的緩存功能都符合這樣的引用場(chǎng)景。

在JDK1.2之后,Java對(duì)引用的概念進(jìn)行了擴(kuò)充,將引用分為強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4種,這4中引用強(qiáng)度一次減弱。

  • 強(qiáng)引用就是指在程序代碼之中普遍存在的,類似"Object obj = new Object()"這類的引用,只要強(qiáng)引用還存在,垃圾收集器永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象

  • 軟引用是用來(lái)描述一些還有用但并非必需的對(duì)象,對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會(huì)把這些對(duì)象列進(jìn)回收范圍進(jìn)行第二次回收。如果這次回收還沒(méi)有足夠的內(nèi)存,才會(huì)拋出內(nèi)存溢出異常。在JDK1.2之后,提供了SoftReference類來(lái)實(shí)現(xiàn)軟引用

  • 弱引用也是用來(lái)描述非必需對(duì)象的,但是它的強(qiáng)度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對(duì)象,只能生存到下一次垃圾收集發(fā)生之前。當(dāng)垃圾收集器工作時(shí),無(wú)論當(dāng)前內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象。在JDK1.2之后,提供了WeakReference類來(lái)實(shí)現(xiàn)弱引用

  • 虛引用也成為幽靈引用或者幻影引用,它是最弱的一中引用關(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)通知。在JDK1.2之后,提供給了PhantomReference類來(lái)實(shí)現(xiàn)虛引用

  • 網(wǎng)友評(píng)論