Java對象引用四個級別(強、軟、弱、虛)

java那些事2019-01-11 21:03:43

點擊上方藍色文字關注↑↑↑↑↑


最近,高級Java技術棧微信群中,有一些猿友在討論JVM中對象的週期問題,有談到引用的級別,現在為大家做個總結吧,雖然大多數公司並沒有意識或者用到這些引用,但瞭解這些基本概念對熟悉整個垃圾回收機制和麵試是非常有幫助的。

為了使程序能更加靈活地控制對象的生命週期,從JDK1.2版本開始,JDK把對象的引用級別分為了以下四種。

這4種級別由高到低依次為:

  • 強引用(StrongReference)

強引用就是我們平常最基本的對象引用,如果是強引用,那回收器不會回收帶有強引用的對象。即使內存不足拋出OutOfMemoryError異常也不會回收強引用對象,存在即合理吧。

如:

  1. User user = new User("Java技術棧");

這就是強引用,user持有了這個對象的存儲地址的引用。

  • 軟引用(SoftReference)

一個對象只有軟引用,如果內存空間足夠情況下垃圾回收器就不會回收它,如果內存空間不夠了就會對這些只有軟引用的對象進行回收。只要垃圾回收器沒有回收,該軟引用對象就可以繼續被程序使用。

所以軟引用一般用來實現一些內存敏感的緩存,只要內存空間足夠,對象就會保持不被回收掉。

  • 弱引用(WeakReference)

弱引用的對象具有更短暫的生命週期,在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。

弱引用可以用來實現一些規範化映射,如WeakHashMap,當key或者value不再被引用時可以自動被回收。

  • 虛引用(PhantomReference)

虛引用顧名思義就是形同虛設,虛引用並不決定對象的生命週期,如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。

虛引用主要用來跟蹤對象被垃圾回收器回收的活動,虛引用必須和引用隊列(ReferenceQueue)聯合使用,當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。

下面通過一張表格來說明它們的回收時間、用途。

引用類型回收時間用途
強引用永不回收普通對象引用
軟引用內在不足回收緩存對象
弱引用垃圾回收時緩存對象
虛引用不確定不確定

不管這些東西平時有沒有用到,我們都必須瞭解這些機制,這對個人的知識面及拓展是非常有幫助的。

近期精選


2017年度Java技術棧精選乾貨總結

2017阿里技術年度精選(全)

個人珍藏最全Spring Boot全套視頻教程

進階Java架構師必看的15本書

分佈式Session共享解決方案


Java技術棧

長按二維碼關注我們



架構|分佈式|技術教程|面經



閱讀原文