在Java虛擬機5:Java垃圾回收(GC)機制詳解一文中,有簡單提到過JVM的四種引用狀態(tài),當(dāng)時只是簡單學(xué)習(xí),知道有這么一個概念,對四種引用狀態(tài)理解不深。這兩天重看虛擬機這部分的時候,寫了很多例子詳細(xì)研究了一下JVM的幾種引用,對于JVM的引用理解加深了不少,因此總結(jié)寫一篇文章總結(jié)并分享下。
首先,還是先從JVM四種引用狀態(tài)開始,這部分摘抄自周志明老師的《深入理解Java虛擬機:JVM高級特性與最佳實踐》一書。
在JDK1.2之前,Java中的引用的定義很傳統(tǒng):如果reference類型的數(shù)據(jù)中存儲的數(shù)值代表的是另外一塊內(nèi)存的起始地址,就稱這塊內(nèi)存代表著一個引用。這種定義很純粹,但是太過狹隘,一個對象在這種頂一下只有被引用或者沒有被引用兩種狀態(tài),對于如何描述一些"食之無味,棄之可惜"的對象就顯得無能為力。我們希望能描述這樣一類對象:當(dāng)內(nèi)存空間還足夠時,則能保留在內(nèi)存之中;如果內(nèi)存空間在進行垃圾收集后還是非常緊張,則可以拋棄這些對象(注意和前面一段藍字的對比學(xué)習(xí))。很多系統(tǒng)的緩存功能都符合這樣的引用場景。
在JDK1.2之后,Java對引用的概念進行了擴充,將引用分為強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4種,這4中引用強度一次減弱。
強引用就是指在程序代碼之中普遍存在的,類似"Object obj = new Object()"這類的引用,只要強引用還存在,垃圾收集器永遠(yuǎn)不會回收掉被引用的對象
軟引用是用來描述一些還有用但并非必需的對象,對于軟引用關(guān)聯(lián)著的對象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會把這些對象列進回收范圍進行第二次回收。如果這次回收還沒有足夠的內(nèi)存,才會拋出內(nèi)存溢出異常。在JDK1.2之后,提供了SoftReference類來實現(xiàn)軟引用
弱引用也是用來描述非必需對象的,但是它的強度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對象,只能生存到下一次垃圾收集發(fā)生之前。當(dāng)垃圾收集器工作時,無論當(dāng)前內(nèi)存是否足夠,都會回收掉只被弱引用關(guān)聯(lián)的對象。在JDK1.2之后,提供了WeakReference類來實現(xiàn)弱引用
虛引用也成為幽靈引用或者幻影引用,它是最弱的一中引用關(guān)系。一個對象是否有虛引用的存在,完全不會對其生存時間構(gòu)成影響,也無法通過虛引用來取得一個對象實例。為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個對象被收集器回收時收到一個系統(tǒng)通知。在JDK1.2之后,提供給了PhantomReference類來實現(xiàn)虛引用
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26