最近学习啦下java引用,但在实验过程中被搞的莫名其妙,直接上代码、
public static void main(String[] args)
{
ReferenceQueue<String> rq = new ReferenceQueue<String>();// 引用队列
WeakReference<String> pr = new WeakReference<String>("weak", rq);
Reference<? extends String> ref = null;
while ((ref = rq.poll()) == null)
{
System.gc();
}
System.out.println(ref == pr);
}
结果是,程序一直在处于循环,不能结束,
想呀想,终于我明白啦,由于我的pr传入的参数是“weak”,以字符串常量的形式,而这些数据是存入java方法区里的字符串常量池,而垃圾回收器,第一主要是针对heap进行回收,二java方法区内的垃圾回收是非常严格的(在大多数情况不必对方法区进行回收)。解决方案显而易见,改成 new String(”weak”);就ok啦。