摘要:為了使程序能更加靈活地控制對(duì)象的生命周期,從版本開始,把對(duì)象的引用級(jí)別分為了以下四種。如技術(shù)棧這就是強(qiáng)引用,持有了這個(gè)對(duì)象的存儲(chǔ)地址的引用。
最近,高級(jí)Java技術(shù)棧微信群中,有一些猿友在討論JVM中對(duì)象的周期問題,有談到引用的級(jí)別,現(xiàn)在為大家做個(gè)總結(jié)吧,雖然大多數(shù)公司并沒有意識(shí)或者用到這些引用,但了解這些基本概念對(duì)熟悉整個(gè)垃圾回收機(jī)制和面試是非常有幫助的。
為了使程序能更加靈活地控制對(duì)象的生命周期,從JDK1.2版本開始,JDK把對(duì)象的引用級(jí)別分為了以下四種。
這4種級(jí)別由高到低依次為:
強(qiáng)引用(StrongReference)
強(qiáng)引用就是我們平常最基本的對(duì)象引用,如果是強(qiáng)引用,那回收器不會(huì)回收帶有強(qiáng)引用的對(duì)象。即使內(nèi)存不足拋出OutOfMemoryError異常也不會(huì)回收強(qiáng)引用對(duì)象,存在即合理吧。
如:
User user = new User("Java技術(shù)棧");
這就是強(qiáng)引用,user持有了這個(gè)對(duì)象的存儲(chǔ)地址的引用。
軟引用(SoftReference)
一個(gè)對(duì)象只有軟引用,如果內(nèi)存空間足夠情況下垃圾回收器就不會(huì)回收它,如果內(nèi)存空間不夠了就會(huì)對(duì)這些只有軟引用的對(duì)象進(jìn)行回收。只要垃圾回收器沒有回收,該軟引用對(duì)象就可以繼續(xù)被程序使用。
所以軟引用一般用來實(shí)現(xiàn)一些內(nèi)存敏感的緩存,只要內(nèi)存空間足夠,對(duì)象就會(huì)保持不被回收掉。
弱引用(WeakReference)
弱引用的對(duì)象具有更短暫的生命周期,在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。不過,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程,因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。
弱引用可以用來實(shí)現(xiàn)一些規(guī)范化映射,如WeakHashMap,當(dāng)key或者value不再被引用時(shí)可以自動(dòng)被回收。
虛引用(PhantomReference)
虛引用顧名思義就是形同虛設(shè),虛引用并不決定對(duì)象的生命周期,如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收。
虛引用主要用來跟蹤對(duì)象被垃圾回收器回收的活動(dòng),虛引用必須和引用隊(duì)列(ReferenceQueue)聯(lián)合使用,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
下面通過一張表格來說明它們的回收時(shí)間、用途。
引用類型 | 回收時(shí)間 | 用途 |
---|---|---|
強(qiáng)引用 | 永不回收 | 普通對(duì)象引用 |
軟引用 | 內(nèi)在不足回收 | 緩存對(duì)象 |
弱引用 | 垃圾回收時(shí) | 緩存對(duì)象 |
虛引用 | 不確定 | 不確定 |
不管這些東西平時(shí)有沒有用到,我們都必須了解這些機(jī)制,這對(duì)個(gè)人的知識(shí)面及拓展是非常有幫助的。
推薦閱讀干貨:Spring Boot & Cloud 最強(qiáng)技術(shù)教程
工具:推薦一款在線創(chuàng)作流程圖、思維導(dǎo)圖軟件
分享Java干貨,高并發(fā)編程,熱門技術(shù)教程,微服務(wù)及分布式技術(shù),架構(gòu)設(shè)計(jì),區(qū)塊鏈技術(shù),人工智能,大數(shù)據(jù),Java面試題,以及前沿?zé)衢T資訊等。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71386.html
摘要:弱引用弱引用比軟引用更弱,被弱引用關(guān)聯(lián)的對(duì)象只能存活到發(fā)生下一次垃圾回收之前,也就是說當(dāng)發(fā)生時(shí),無論當(dāng)前內(nèi)存是否足夠,都會(huì)被回收掉。這是最終的狀態(tài),不能再變?yōu)槠渌鼱顟B(tài)。如下圖所示對(duì)象都是可被回收的。 【干貨點(diǎn)】看完該篇文章,就基本可以解答面試熱點(diǎn)【談?wù)剬?duì)Java中幾種引用的理解】了。 大家都知道我公眾號(hào)的副業(yè)是 showImg(https://segmentfault.com/img/...
摘要:當(dāng)一個(gè)對(duì)象被一個(gè)或一個(gè)以上的引用變量所引用時(shí),它處于可達(dá)狀態(tài),不可能被系統(tǒng)垃圾回收機(jī)制回收。虛引用主要用于跟蹤對(duì)象被垃圾回收的狀態(tài),虛引用不能單獨(dú)使用,虛引用必須和引用隊(duì)列聯(lián)合使用。 當(dāng)程序創(chuàng)建對(duì)象、數(shù)組等引用類型實(shí)體時(shí),系統(tǒng)都會(huì)在堆內(nèi)存中為之分配一塊內(nèi)存區(qū),對(duì)象就保存在這塊內(nèi)存區(qū)中,當(dāng)這塊內(nèi)存不再被任何引用變量引用時(shí),這塊內(nèi)存就變成垃圾,等待垃圾回收機(jī)制進(jìn)行回收。垃圾回收機(jī)制具有如下...
摘要:在之后,對(duì)引用的概念進(jìn)行了擴(kuò)充,將引用分為強(qiáng)引用軟引用弱引用虛引用種,這種引用強(qiáng)度依次逐漸減弱。軟引用是用來描述一些還有用但并非必需的對(duì)象。虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關(guān)系。 以下內(nèi)容摘自《深入理解Java虛擬機(jī) JVM高級(jí)特性與最佳實(shí)踐》第2版,強(qiáng)烈推薦沒有看過的同學(xué)閱讀,讀完的感覺就是原來學(xué)的都是些什么瘠薄東西(╯‵□′)╯︵┴─┴ 在JDK1.2以前,Ja...
摘要:強(qiáng)引用如果一個(gè)對(duì)象具有強(qiáng)引用垃圾回收器絕不會(huì)回收它當(dāng)內(nèi)存空間不足時(shí)虛擬機(jī)寧愿拋出錯(cuò)誤使程序異常終止也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來解決內(nèi)存不足問題軟引用如果內(nèi)存空間充足垃圾回收器就不會(huì)回收它如果內(nèi)存空間不足就會(huì)回收這些對(duì)象的內(nèi)存只要垃圾回 強(qiáng)引用 如果一個(gè)對(duì)象具有強(qiáng)引用,垃圾回收器絕不會(huì)回收它.當(dāng)內(nèi)存空間不足時(shí),java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終...
內(nèi)部類 內(nèi)部類主要作用 內(nèi)部類提供了更好的封裝,可以吧內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包中的其他類訪問該類。 內(nèi)部類成員可以直接訪問外部類的私有數(shù)據(jù),因?yàn)閮?nèi)部類被當(dāng)成其外部類成員,同一個(gè)類的成員之間可以互相訪問,但外部類不能訪問內(nèi)部類的實(shí)現(xiàn)細(xì)節(jié)。 匿名內(nèi)部類適合用于創(chuàng)建那些僅需要使用一次的類。 定義內(nèi)部類與外部類的語法大致相同,內(nèi)部類除需要定義在其他類里面之外,還有兩點(diǎn)區(qū)別: 內(nèi)...
閱讀 1621·2019-08-29 13:53
閱讀 3222·2019-08-29 13:50
閱讀 869·2019-08-27 10:51
閱讀 577·2019-08-26 18:36
閱讀 1827·2019-08-26 11:00
閱讀 621·2019-08-26 10:36
閱讀 3229·2019-08-23 17:58
閱讀 2039·2019-08-23 15:17