字符串常量是强引用, 对象是弱引用,使用弱引用管理对象,在内存不够下,通过手动调用GC实现节约开支目的
案例1:
/**
* 引用分类:强、软、弱、虚
* 强与弱引用
* @author Administrator
*
*/
public class RefDemo {
/**
* @param args
*/
public static void main(String[] args) {
//testStrong();
testWeak();
}
/**
* gc运行前:sina is very good
gc运行后:null
*/
private static void testWeak() {
//字符串对象
String str =new String("sina is very good");
//弱引用 管理 对象
WeakReference<String> wr =new WeakReference<String>(str);
System.out.println("gc运行前:"+wr.get());
//断开引用
str =null;
//通知回收
System.gc();
System.runFinalization();
//对象被回收
System.out.println("gc运行后:"+wr.get());
}
/**
* 结果:
* gc运行前:sina is very good
gc运行后:sina is very good
*/
public static void testStrong(){
//字符串常量池 共享(不能回收)
String str ="sina is very good";
//弱引用 管理 对象
WeakReference<String> wr =new WeakReference<String>(str);
System.out.println("gc运行前:"+wr.get());
//断开引用
str =null;
//通知回收
System.gc();
System.runFinalization();
System.out.println("gc运行后:"+wr.get());
}
}
案例2 WeakHashMap的使用:
public static void main(String[] args) {
WeakHashMap<String,String> map =new WeakHashMap<String,String>();
//测试数据
//常量池对象,不会回收 属于强引用
map.put("abc", "a");
map.put("d", "test");
//gc运行 已被回收
map.put(new String("sina"), "c");
map.put(new String("dsf"), "d");
//通知回收
System.gc();
System.runFinalization();
System.out.println(map.size()); // 结果是2
}