前面的简介:
strongReference:强引用
softReference:软引用。
weakReference:弱引用
phtomReference:虚引用
一:strongReference
String a = new String("hello world");
String b=a;
咯,这里b就是个强引用咯。反正就是会一直指向那个String的。也就是大家最常用的。
二:softReference
String a = new String("hello world");
ReferenceQueue<String> queue = new ReferenceQueue<String>();
SoftReference<String> ref = new SoftReference<String>(a, queue);
这些reference主要的作用就是体现在gc的时候了。softReference的作用是:
我的理解就是,GC对Soft reference 还是比较客气的,内存不够的时候才把它干掉,也就是在jvm抛出outOfMemory异常之前,会把这些都给回收掉,以空闲处内存。当内存不足的时候, 这些就会被无情的干掉了。
现在我们来看下它的gc过后的效果。
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
/**
* @author guoliang created TestReferenceMain.java
* @since 2010-5-7 下午06:31:35
*/
public class TestReferenceMain {
/**
* @param args
*/
public static void main(String[] args) {
String a = new String("hello world");
ReferenceQueue<String> queue = new ReferenceQueue<String>();
SoftReference<String> ref = new SoftReference<String>(a, queue);
// WeakReference<String> ref = new WeakReference<String>(a, queue);
// PhantomReference<String> ref = new PhantomReference<String>(a, queue);
a = null;
System.gc();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String value = ref.get();
System.out.println(value);
System.out.println(ref.isEnqueued());
System.out.println(queue.poll());
}
}
输出结果为:
[Full GC 317K->169K(5056K), 0.1891790 secs]
hello world
false
null
可以看出,虽然gc了,但是这个reference还是没有被回收,因为当前的内存还是充足的,大家可以在这里做个例子,
让它outOfMemory再来看看这个reference是否还在,我做过实验,是会没的,oh yeah!~
三:weakReference
String a = new String("hello world");
ReferenceQueue<String> queue = new ReferenceQueue<String>();
WeakReference<String> ref = new WeakReference<String>(a, queue);
简单的说:就是gc会蹂躏这种对象,一GC,发现这种对象没人引用了,就把丫的给回收了,不给你机会的。
代码来看看结果.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
/**
* @author guoliang created TestReferenceMain.java
* @since 2010-5-7 下午06:31:35
*/
public class TestReferenceMain {
/**
* @param args
*/
public static void main(String[] args) {
String a = new String("hello world");
ReferenceQueue<String> queue = new ReferenceQueue<String>();
// SoftReference<String> ref = new SoftReference<String>(a, queue);
WeakReference<String> ref = new WeakReference<String>(a, queue);
// PhantomReference<String> ref = new PhantomReference<String>(a, queue);
a = null;
System.gc();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String value = ref.get();
System.out.println(value);
System.out.println(ref.isEnqueued());
System.out.println(queue.poll());
}
}
输出结果为:
[Full GC 317K->169K(5056K), 0.0074055 secs]
null
true
java.lang.ref.WeakReference@14318bb
可以看到一不引用a,一gc,weakReference对应的就被回收了。
后记:soga,弄完这个感觉还是不错的,以前很少去关注这个。然后就是在eclipse里面调用system.gc还是有用的,想要打出gc的详情可以 在ecliose的run的configure里面的arguments里面加上对应的参数: