楼上哥们儿说得在理,查了些资料,确实是。实验了以下,如下:
代码一:
String str = new String("Hi");
ReferenceQueue rq = new ReferenceQueue();
WeakReference wf = new WeakReference(str, rq);
str=null;
String str1=(String) wf.get();
System.out.println("str1:"+str1);
此时,输出结果为:
str1:Hi
代码二:
String str = new String("Hi");
ReferenceQueue rq = new ReferenceQueue();
WeakReference wf = new WeakReference(str, rq);
str=null;
System.gc();
String str1=(String) wf.get();
System.out.println("str1:"+str1);
此时,输出结果为:
str1:null
证明弱引用在垃圾回收时被清掉了。
代码三:
String str = new String("Hi");
ReferenceQueue rq = new ReferenceQueue();
SoftReference<String> sr=new SoftReference<String>(str);
str=null;
String str2=sr.get();
System.out.println("str2:"+str2);
此时,输出结果为:
str2:Hi
代码四:
String str = new String("Hi");
ReferenceQueue rq = new ReferenceQueue();
SoftReference<String> sr=new SoftReference<String>(str);
str=null;
System.gc();
String str2=sr.get();
System.out.println("str2:"+str2);
此时,输出结果为:
str2:Hi
证明软引用垃圾回收时没被清掉,只是不知道如何模拟内存不足时清掉软引用的?
另外,如下代码垃圾回收时弱引用也没被清掉,不知为何?
String str = new String("Hi");
ReferenceQueue rq = new ReferenceQueue();
WeakReference wf = new WeakReference(str, rq);
SoftReference<String> sr=new SoftReference<String>(str);
str=null;
System.gc();
System.gc();
String str2=sr.get();
String str1=(String) wf.get();
System.out.println("str1:"+str1);
System.out.println("str2:"+str2);
输出结果为:
str1:Hi
str2:Hi |