最近学习啦下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啦。