【JVM】強引用、軟引用、弱引用、虛引用分別是什麼

1.名字的由來前四個字母分別爲 Naming 和 Configuration 的前兩個字母,最後的 s 爲 service2.是什麼一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。Nacos:Dynamic Naming and Configuration ServiceNacos就是【註冊中心+配置中心】的組合 ===》Nacos = Eureka + Config + Bus

1)強引用(默認支持模式)

當內存不足,JVM開始垃圾回收,對於強引用的對象,就算是出現了OOM也不會對該對象進行回收,死都不收。強引用是我們最常見的普通對象引用,只要還有強引用指向一個對象,就能表明對象還“活着”,垃圾收集器不會碰這種對象。在Java中最常見的就是強引用,把一個對象賦給一個引用變量,這個引用變量就是一個強引用。當一個對象被強引用變量引用時,它處於可達狀態,它是不可能被垃圾回收機制回收的,即使該對象以後永遠都不會被用到,JVM也不會回收。因此 強引用是造成Java內存泄漏 的主要原因之一。
對於一個普通對象,如果沒有其它的引用關係,只要超過了引用的作用域或者顯示地將相應(強)引用賦值爲null,一般認爲就是可以被垃圾收集的了(不過回收時機還是要看垃圾收集策略)。

2)軟引用

軟引用是一種相對強引用弱化了一些的引用,需要用 java.lang.ref.SoftReference 類來實現,可以讓對象豁免一些垃圾收集。
對於只有軟引用的對象來說:當系統內存充足時它不會被回收,不足時會被回收。
軟引用通常用在對內存敏感的程序中,比如高速緩存就有用到軟引用,內存夠用的時候就保留,不夠用就回收。

3)弱引用

弱引用需要用 java.lang.ref.WeakReference 類來實現,它比軟引用的生存期更短。
對於只有弱引用的對象來說,只要垃圾回收機制一運行,不管JVM的內存空間是否足夠,都會回收該對象佔用的內存。

4)虛引用

需要使用 java.lang.ref.PhantomReference 類來實現。
顧名思義,就是形同虛設,與其他集中引用都不同,虛引用並不會決定對象的生命週期。
如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,再任何時候都可能被垃圾回收器回收,它不能單獨使用也不能通過它訪問對象,虛引用必須和引用隊列(ReferenceQueue)聯合使用。
虛引用的主要作用是跟蹤對象被垃圾回收的狀態。僅僅是提供了一種確保對象被 finalize 以後,做某些事情的機制。
PhantomReference 的get方法總是返回null,因此無法訪問對應的引用對象。其意義在於說明一個對象已經進入 finalization 階段,可以被GC回收,用來實現比 finalization 機制更靈活的回收操作。
換句話說,設置虛引用關聯的唯一目的,就是在這個對象被收集器回收的時候,收到一個系統通知或者後續添加進一步的處理。
Java技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章