關於 弱引用 WeakReference

2021-05-08 01:06:14 字數 1048 閱讀 8508

(弱引用)

[1]強引用

如果有強引用存在,gc是不會**物件的。

[2]弱引用

弱引用可以讓您保持對物件的引用,

同時允許gc在必要時釋放物件,**記憶體。

[3]弱引用使用場景

對於那些建立便宜但耗費大量記憶體的物件,

希望保持該物件,又要在應用程式需要時使用,

同時希望gc必要時**時,可以考慮使用弱引用。

單引數版

雙引數復活版

需要finalize的物件在最終釋放前會有一次復活,第二個引數的作用。

[1]短引用

第二個引數給false,這個弱引用就是乙個short weak reference(短弱引用),

當gc**時,發現根中沒有這個物件的引用了,就認為這個物件無用,

這時短弱引用對這個物件的跟蹤到此為止,弱引用的 target被設定為null。

[2]長引用

如果第二個引數給true,這個弱引用就是乙個long weak reference(長弱引用)。

在物件的finalize方法沒有被執行以前,target都可用。

不過這是物件的某些成員變數也許已經被**,所以使用起來要想當小心。

[3]finalize物件「復活」

short weak reference會忽略,即wr.target會置null,

而long weak reference則會跟蹤,wr.target仍然refer to 原物件,這個是兩者的最大區別。

如果沒有finalize,則兩種weak reference表現完全相同。

原理:

gc維護了兩個列表來跟蹤兩種弱引用的目標物件,

在乙個 weakreference物件建立時,

它在相應的列表中找到乙個位置,

將目標物件的引用放入,

很顯然,這兩個列表不是根的一部分。

在gc進行記憶體**的時候,如果要**某乙個物件,

會檢查弱引用的列表,如果儲存著這個物件的引用,

則將其設為null。

關於C語言中的強符號 弱符號 強引用和弱引用

首先我表示很悲劇,在看 程式設計師的自我修養 鏈結 裝載與庫 之前我竟不知道c有強符號 弱符號 強引用和弱引用。在看到3.5.5節弱符號和強符號時,我感覺有些困惑,所以寫下此篇,希望能和同樣感覺的朋友交流也希望高人指點。首先我們看一下書中關於它們的定義。引入場景 1 檔案a中定義並初始化變數i in...

強引用,軟引用,弱引用

強引用 強引用設定為空,物件立馬會被 public class normalreference classm 軟引用 軟引用當引用存在的時候,只有當記憶體不足的時候才去 public class t0 softreference catch exception e system.out.printl...

lua的弱弱引用表

lua有gc。細節無需太關注,知道些主要的即可。能local就一定不要global 還有在陣列裡的物件,除非顯式 nil,否則非常難 只是能夠用弱引用表來告訴gc。外部引用為0,就不要管我,請del it。weak table是通過元表實現,元表裡的 mode欄位包括k或者v k表示key為弱引用 ...