深入解析強引用、軟引用、弱引用、幻象引用

深入解析強引用、軟引用、弱引用、幻象引用

關於強引用、軟引用、弱引用、幻象引用的區別,在一些大公司的面試題中經常出現,可能有些小夥伴覺得這個知識點比較冷門,但其實大家在開發中經常用到,如new一個對象的時候就是強引用的應用。

在java語言中,除了原始數據類型(boolean、byte、short、char、int、float、double、long)的變量,其他所有都是所謂的引用類型,指向各種不同的對象。理解這些引用的區別,對於掌握java對象生命週期和JVM內部相關機制非常有幫助。也有助於更深刻的理解底層對象生命週期、垃圾收集機制等,對設計可靠的緩存框架、診斷應用OOM等問題也大有裨益。

這四種應用主要的區別體現在對象不同的可達性狀態和對垃圾收集的影響,他們之間的可達性狀態可以參看下圖:

深入解析強引用、軟引用、弱引用、幻象引用

1.強引用(strong reference)

強引用就是我們最常見的普通對象引用(如new 一個對象),只要還有強引用指向一個對象,就表明此對象還“活著”。在強引用面前,即使JVM內存空間不足,JVM寧願拋出OutOfMemoryError運行時錯誤(OOM),讓程序異常終止,也不會靠回收強引用對象來解決內存不足的問題。對於一個普通的對象,如果沒有其他的引用關係,只要超過了引用的作用域或者顯式地將相應(強)引用賦值為null,就意味著此對象可以被垃圾收集了。但要注意的是,並不是賦值為null後就立馬被垃圾回收,具體的回收時機還是要看垃圾收集策略的。

如Object obj = new Object();


分享到:


相關文章: