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