关于WeakReference的回收问题
这是一段测试WeakReference的回收的代码,可惜失败了。
是否有高手能解释这个问题,顺便类比着这个类给我讲一下SoftReference和PhantomReference的回收问题。
import java.util.*;
import java.lang.ref.*;
public class WeakTest {
//尽量大的一个数,尽量占用内存
static int VeryBig=1000000;
//配合VeryBig,尽量吃掉内存
static int MostLength=4;
private static class MyObject{
long[] l;
public MyObject(){
l=new long[VeryBig];
}
}
public static void main(String arg[]){
//尽量使用内存
ArrayList ml=new ArrayList();
for(int i=0;i<MostLength;i++){
WeakTest.MyObject m=new WeakTest.MyObject();
System.out.println(i);
ml.add(m);
}
//用WeakReference注册到ReferenceQueue中,然后置空ml,再执行System.gc()
ReferenceQueue rq=new ReferenceQueue();
WeakReference wr=new WeakReference(ml,rq);
ml=null;
System.gc();
//按理说现在的内存中还和ml被填满之前一样,可以继续构造出这么多对象,可是,系统仍然崩溃了!
System.out.println();
for(int i=0;i<4;i++){
WeakTest.MyObject m=new WeakTest.MyObject();
System.out.println(i);
ml.add(m);
}
}
}