默認對象實例化後得到的都是強引用,不過有些時候對於一些複雜的大對象,出於性能考慮,並不希望進行頻繁的初始化,此時弱引用就可以派上用場。
用法:先用WeakReference包裝複雜對象,到需要該複雜對象的時候,檢查一下弱引用的IsAlive屬性,如果true,就可以通過Target直接得到複雜對象,省去了實例化的過程。
簡單的例子:
static void Main(string[] args)
{
var weakRef = GetWeakRef();
GC.Collect();
if (weakRef.IsAlive)
{
var obj = weakRef.Target as ComplexObject;
Console.WriteLine(obj);
}
else
{
Console.WriteLine("Reference is not available.");
}
Console.Read();
}
private static WeakReference GetWeakRef()
{
return new WeakReference(new ComplexObject());
}
本例中如果調用了GC回收,輸出爲
Reference is not available.
如果不調用GC回收,輸出爲
ConsoleApplication1.ComplexObject
雖然都是弱,但弱事件的情形卻不太一樣,它的目的在於避免內存洩漏。
普通事件建立了一個發佈者到偵聽者之間的強引用,衹要發佈者存在,偵聽者就無法被回收,即使此時偵聽者已沒有存在的必要。
內存洩漏的一個簡單例子:
直觀的解決辦法就是:偵聽者主動解除事件訂閲,沒了強引用,自然就可以回收了。
不過有時候難以確定解除事件的時機,此時可以考慮使用弱事件,它的訣竅在於引入第三方的管理器,這樣就不會在發佈者和偵聽者之間直接建立引用,從而方便各自的回收。
弱引用對象,它們並不禁止其指示對象變得可終結,並被終結,然後被回收。弱引用最常用於實現規范化的映射。 假定垃圾回收器確定在某一時間點上某個對象是弱可到達對象。這時,它將自動清除針對此對象的所有弱引用,以及通過強引用鏈和軟引用,可以從其到達該對象的針對任何其他弱可到達對象的所有弱引用。同時它將聲明所有以前的弱可到達對象為可終結的。在同一時間或晚些時候,它將那些已經向引用隊列注冊的新清除的弱引用加入隊列。 *******************************************************************************************
SoftReference:
軟引用對象,在響應內存需要時,由垃圾回收器決定是否清除此對象。軟引用對象最常用於實現內存敏感的緩存。 假定垃圾回收器確定在某一時間點某個對象是軟可到達對象。這時,它可以選擇自動清除針對該對象的所有軟引用,以及通過強引用鏈,從其可以到達該對象的針對任何其他軟可到達對象的所有軟引用。在同一時間或晚些時候,它會將那些已經向引用隊列注冊的新清除的軟引用加入隊列。 軟可到達對象的所有軟引用都要保證在虛擬機拋出 OutOfMemoryError 之前已經被清除。否則,清除軟引用的時間或者清除不同對象的一組此類引用的順序將不受任何約束。然而,虛擬機實現不鼓勵清除最近訪問或使用過的軟引用。 此類的直接實例可用於實現簡單緩存;該類或其派生的子類還可用於更大型的數據結構,以實現更復雜的緩存。只要軟引用的指示對象是強可到達對象,即正在實際使用的對象,就不會清除軟引用。例如,通過保持最近使用的項的強指示對象,並由垃圾回收器決定是否放棄剩余的項,復雜的緩存可以防止放棄最近使用的項
****************************************************
weakReference一般用來防止內存洩漏,要保證內存被VM回收
弱引用對象,它們並不禁止其指示對象變得可終結,並被終結,然後被回收。弱引用最常用於實現規范化的映射。 假定垃圾回收器確定在某一時間點上某個對象是弱可到達對象。這時,它將自動清除針對此對象的所有弱引用,以及通過強引用鏈和軟引用,可以從其到達該對象的針對任何其他弱可到達對象的所有弱引用。同時它將聲明所有以前的弱可到達對象為可終結的。在同一時間或晚些時候,它將那些已經向引用隊列注冊的新清除的弱引用加入隊列。 *******************************************************************************************
SoftReference:
軟引用對象,在響應內存需要時,由垃圾回收器決定是否清除此對象。軟引用對象最常用於實現內存敏感的緩存。 假定垃圾回收器確定在某一時間點某個對象是軟可到達對象。這時,它可以選擇自動清除針對該對象的所有軟引用,以及通過強引用鏈,從其可以到達該對象的針對任何其他軟可到達對象的所有軟引用。在同一時間或晚些時候,它會將那些已經向引用隊列注冊的新清除的軟引用加入隊列。 軟可到達對象的所有軟引用都要保證在虛擬機拋出 OutOfMemoryError 之前已經被清除。否則,清除軟引用的時間或者清除不同對象的一組此類引用的順序將不受任何約束。然而,虛擬機實現不鼓勵清除最近訪問或使用過的軟引用。 此類的直接實例可用於實現簡單緩存;該類或其派生的子類還可用於更大型的數據結構,以實現更復雜的緩存。只要軟引用的指示對象是強可到達對象,即正在實際使用的對象,就不會清除軟引用。例如,通過保持最近使用的項的強指示對象,並由垃圾回收器決定是否放棄剩余的項,復雜的緩存可以防止放棄最近使用的項
****************************************************
weakReference一般用來防止內存洩漏,要保證內存被VM回收