Java中的四種引用型別分析

2021-08-09 01:52:37 字數 1336 閱讀 1318

強引用、軟引用、弱引用、虛引用,接下來分別講一下他們的概念和我遇到過的實際應用型別。

強引用就是我們平時使用的引用型別,只要指向物件的變數繼續存在,變數指向的物件就不會被**。

stringbuffer buffer = new stringbuffer();
弱引用,只要沒有任何其他強引用引用到這個弱引用指向的物件,這個弱引用指向的物件就可能會被**,當你想引用乙個物件,但是這個物件有自己的生命週期,你不想介入這個物件的生命週期,這時候你就是用弱引用。

例如下圖,該weakreference指向的物件隨時可能被**

weakreferenceweakreference=new weakreference(new user());
接下來說一說我在實際專案中對弱引用的應用。

在我開發的乙個遊戲框架中有各種各樣的單例管理器物件,例如遊戲物件管理器,所有遊戲物件一旦建立會被自動加入該管理器,方便對遊戲物件的整體管理,包括實際各種快取策略,物件池之類的。

現在假設我們需要在地圖載入完成後建立乙個怪物,那麼此時就有兩個地方引用到該物件(一般情況下要多得多,這裡做簡化),分別是建立該物件的**處。以及自動加入的物件管理器處。

此時如果怪物死亡後,單純的在**塊中設定怪物為null並不能使gc**怪物物件,因為遊戲物件管理器還一直引用著怪物。

但是作為乙個框架,我們不希望開發者需要呼叫例如 manager.remove(object)這樣的**來將怪物物件從物件管理器中移除,這個時候弱引用就派上了用場。

我們可以在所有單例管理器需要引用到怪物物件的地方,都用弱引用來引用,這樣就可以將框架**和使用者**完全分離,開發者只需要將乙個物件設定為null,就可以讓gc**他,而不用呼叫框架**,乙個乙個的從單例管理器中去除這個物件。

(當然還有另外一種方法,就是用乙個內建在物件中的方法來完成這些remove操作。例如object.destroy(),每次移除物件之前呼叫destroy方法,而不是設定為null,然後在destroy中從管理器中將自身移除,兩種方法都各有好處,這裡不細說了)

軟引用

軟引用的移除邏輯和弱引用相同,唯一的區別是軟引用在記憶體充足時並不會**物件,只有記憶體不足時才會**只有軟引用指向的物件。

軟引用比較適用於構建快取之類的東西,我之前的專案中就使用軟引用來實現乙個快取,當載入時首先查詢影象快取,如果有的話直接返回快取,沒有的話先載入到快取中,再返回。

當然這樣帶來的乙個問題就是影象快取會越來越大,雖然也可以自己實現**演算法, 但是使用軟引用在記憶體不足的時候自動**引用更加簡單。

虛引用

虛引用主要用來觀測物件什麼時候被**,

(這個實際我在專案中沒怎麼用過)。

java四種引用

1 強引用 諸如object a new object 如果在乙個方法體內,只要方法沒結束,這個物件就不會被 2 軟引用 在將要丟擲out of memory之前首先會 已經無引用 不可達的物件。3 弱引用 在gc時,就會 已經無引用 不可達的物件。4 虛引用 任何時候可能被 好像一般用來跟蹤物件 ...

四種引用型別

在 j a 中最常見的就是強引用,把乙個物件賦給乙個引用變數,這個引用變數就是乙個強引用。當乙個物件被強引用變數引用時,它處於可達狀態,它是不可能被垃圾 機制 的,即使該物件以後永遠都不會被用到 jvm 也不會 因此強引用是造成 j a 記憶體洩漏的主要原因之一。軟引用需要用 softreferen...

Java 的 四種引用

從jdk 1.2版本開始,把物件的引用分為4種級別,從而使程式能更加靈活地控制物件的生命週期。這4種級別由高到低依次為 強引用 軟引用 弱引用和虛引用。強引用 就算丟擲記憶體溢位也不會釋放的物件,如object object new object 軟引用 系統快要傳送記憶體溢位的時候,會將這些物件 ...