引用及應用(Reference\WeakHashMap)十六

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;


/**
 * 引用的四大類型:強、軟、弱、虛
 * 1)強引用:StrongReference,引用指向對象,gc(Garbage collection)運行時
 *  不回收。
 * 2)軟引用:SoftReference gc運行時可能回收(jvm內存不夠)
 * 3)弱引用:WeakReference gc運行時立即回收
 * 4)虛引用:PhantomReference 類似於無引用,主要跟蹤對象被回收的狀態,不能單獨使用,
 *   必須與引用隊列(ReferenceQueue)聯合使用
 *   
 * 目的:避免對象長時間駐留內存,解決垃圾回收機制時間問題。
 * 
 * WeakHashMap
 * 鍵爲弱引用,回收鍵後自動刪除 key-value對象。
 */
public class ReferenceTest {
public static void main(String[] args) {
System.out.println("內存爲null,表示已經釋放回收");
testStrong();
System.out.println("======================");
testWeak();
System.out.println("======================");
testSoft();
System.out.println("======================");
testWeakHashMap();
}

/**
*  StrongReference 是 Java的默認引用實現,它會儘可能長時間的存活於 JVM內,
*   當沒有任何對象指向它時 GC 執行後將會被回收
*/
static void testStrong(){
Object strong=new Object();
//通過賦值創建強引用:直接引用
Object strongReference=strong;
strong=null;

System.gc();
System.out.println(strongReference);
}
//====================================
static void testWeak(){
Object weak=new Object();
WeakReference<Object> wrf=new WeakReference<Object>(weak);
//===================
String str="共享的常量值,住在-堆內存常量池";
WeakReference<Object> wrf1=new WeakReference<Object>(str);


weak=null;
str=null;

System.gc();
System.runFinalization();
System.out.println("回收:"+wrf.get());
System.out.println("常量池對象不回收:"+wrf1.get());


}
//=====================================
static void testSoft(){
Object soft=new Object();
SoftReference<Object> srf=new SoftReference<Object>(soft);

soft=null;
System.gc();
System.runFinalization();
System.out.println(srf.get());
}
//============WeakHashMap==============
static void testWeakHashMap(){
WeakHashMap<String,String> map=new WeakHashMap<String,String>();
//常量池對象,不回收
map.put("a", "A");
map.put("b", "B");
//回收
map.put(new String("c"), "c");
map.put(new String("d"), "d");

System.gc();
System.runFinalization();
System.out.println(map.size());
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章