在 Java 語言中,除了原始數據類型的變量,其他所有都是所謂的引用類型,指向各種不同的對象,Java中根據其生命周期的長短,將引用分為4類,分別是強引用、弱引用、軟引用和幻象引用(虛引用),不同的引用類型,主要體現的是對象不同的可達性狀態和對垃圾回收集的影響。
強引用
- 什么是強引用
Object obj = new Object(),這里的的obj就是強引用,通過關鍵字new創建的對象所關聯的引用就是強引用。 只要有強引用指向一個對象,就能表明對象還活着,垃圾收集器就不會觸碰這種對象,當JVM內存空間不足,JVM寧願拋出OutOfMemoryError運行時錯誤(OOM),使程序異常終止,也不會靠隨意回收具有強引用的“存活”對象來解決內存不足的問題。對於一個普通的對象,如果沒有其他的引用關系,只要超過了引用的作用域或者顯式地將相應(強)引用賦值為 null,就是可以被垃圾收集的了,具體回收時機還是要看垃圾收集策略
軟引用
- 什么是軟引用
是一種相對強引用弱化一些的引用,可以讓對象豁免一些垃圾收集,只有當 JVM 認為內存不足時,才會去試圖回收軟引用指向的對象。
軟引用通過SoftReference類實現。 軟引用的生命周期比強引用短一些。只有當 JVM 認為內存不足時,才會去試圖回收軟引用指向的對象:即JVM 會確保在拋出 OutOfMemoryError 之前,清理軟引用指向的對象
- 有什么應用場景
軟引用通常用來實現內存敏感的緩存。如果還有空閑內存,就可以暫時保留緩存,當內存不足時清理掉,這樣就保證了使用緩存的同時,不會耗盡內存。
弱引用
- 什么是弱引用
並不能使對象豁免垃圾收集,僅僅是提供一種訪問在弱引用狀態下對象的途徑。這就可以用來構建一種沒有特定約束的關系,比如,維護一種非強制性的映射關系,如果試圖獲取時對象還在,就使用它,否則重現實例化
弱引用通過WeakReference類實現。 弱引用的生命周期比軟引用短。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存
- 有什么應用場景
弱應用同樣可用於內存敏感的緩存
幻象引用(虛引用)
- 什么是幻象引用
虛引用也叫幻象引用,通過PhantomReference類來實現。無法通過虛引用訪問對象的任何屬性或函數。幻象引用僅僅是提供了一種確保對象被 finalize 以后,做某些事情的機制。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收
- 有什么應用場景
可用來跟蹤對象被垃圾回收器回收的活動,當一個虛引用關聯的對象被垃圾收集器回收之前會收到一條系統通知
歡迎大家去 我的博客 瞅瞅,里面有更多關於測試實戰的內容哦!!