天天看點

java soft weak_java的softReference與weakReference

java.lang.ref包下提供了三個類SoftReference,phantomReference WeakReference,分别代表軟引用,虛引用和弱引用

強引用,最常見的引用,程式建立一個對象,并把這個對象指派給一個引用變量,通過該引用來實際操作對象

軟引用,需要通過SoftReference類來實作,當一個對象隻有一個軟引用,它有可能被垃圾回收機制回收。記憶體空間足夠時,不會被回收,不足夠時将被回收

弱引用,需要通過WeakReference類來實作,當垃圾回收機制運作時,不管記憶體是否足夠,總會回收該對象所占用的記憶體

weakReference一般用來防止記憶體洩漏,要保證記憶體被VM回收

softReference的話,好像多用作來實作cache機制.

軟引用(Soft  Reference)的主要特點是具有較強的引用功能。隻有當記憶體不夠的時候才回收這類記憶體,是以在記憶體足夠的時候,他們通常不被回收。另外,這些引用對象還能保證在Java  抛出OutOfMemory異常之前,被設定為null。他可以用于實作一些常用資源的緩存,實作Cache的功能,保證最大限度的使用記憶體而不引起OutOfMemory異常。

軟引用技術的引進使Java應用可以更好的管理記憶體,穩定系統,防止系統記憶體溢出,避免系統崩潰。是以在處理一些占用記憶體大而且聲明周期較長,但使用并不頻繁的對象時應盡量應用該技術。但事物總帶有兩面性的,有利也有弊,在某些時候對軟引用的使用會降低應用的運作效率與性能,例如:應用軟引用的對象的初始化過程較為耗時,或者對象的狀态在程式的運作過程中發生了變化,都會給重新建立對象與初始化對象帶來不同程度的麻煩,有些時候我們要權衡利弊擇時應用。

Java代碼

java soft weak_java的softReference與weakReference
java soft weak_java的softReference與weakReference
java soft weak_java的softReference與weakReference

importjava.lang.ref.WeakReference;

publicclassTestReference

{

publicstaticvoidmain(String[] args)

{

//建立一個字元串對象

String str = newString("Structs2 權威指南");

//建立一個弱引用,讓此引用引用到"Struts2 權威指南"字元串

WeakReference wr = newWeakReference(str);

//切斷str引用和"Struts2 權威指南"字元串之間的引用

str = null;

//取出弱引用所引用的對象

System.out.println(wr.get());

//強制垃圾回收

System.gc();

System.runFinalization();

///再次取出弱引用所引用的對象

System.out.println(wr.get());

}

}

import java.lang.ref.WeakReference;

public class TestReference

{

public static void main(String[] args)

{

//建立一個字元串對象

String str = new String("Structs2 權威指南");

//建立一個弱引用,讓此引用引用到"Struts2 權威指南"字元串

WeakReference wr = new WeakReference(str);

//切斷str引用和"Struts2 權威指南"字元串之間的引用

str = null;

//取出弱引用所引用的對象

System.out.println(wr.get());

//強制垃圾回收

System.gc();

System.runFinalization();

///再次取出弱引用所引用的對象

System.out.println(wr.get());

}

}

輸出: Struts2 權威指南 null