讨论一段关于java内存管理的代码
代码:
package test;
import org.apache.commons.collections.ReferenceMap;
public class MemoryTest
{
public ReferenceMap getSoftCache() {
return softCache;
}
private final transient ReferenceMap softCache = new ReferenceMap(ReferenceMap.SOFT,ReferenceMap.SOFT);
public static void main(String[] args)
{
MemoryTest tester = new MemoryTest();
tester.prepared();
System.out.println("cache size:"+tester.getSoftCache().size());
//tester对象是否最终能被回收?
MyThread myThread = new MyThread(tester.getSoftCache());
myThread.start();
}
public void prepared()
{
for(int i=0;i<1000;i++)
{
ConcreteObserver observer = new ConcreteObserver();
softCache.put(observer.toString(),observer);
}
}

}
class MyThread extends Thread
{
private Object cacheObj;
public MyThread(Object cacheObj)
{
this.cacheObj=cacheObj;
}
/* (non-Javadoc)
 * @see java.lang.Thread#run()
 */
public void run() {
          while(true)
          {
           //以下代码被注释掉内存是否有不同变化,强制GC内存是否有不同变化?
           //System.out.println(cacheObj);
          }
 }

}

解决方案 »

  1.   

    你的main执行完毕后,tester会被回收
      

  2.   

    tester会被回收. 经过编译器优化后, MyThread的cacheObj真正存在对象句柄
      

  3.   

    楼上的,对于这些原理我是知道的,但有一点不是很明白就是
    对于softCache中的Object如果没有被应用,强制GC,是否应该都被回收
    我的测试是结果是被回收的,但又有些不相信我写的测试程序
    呵呵,所以求证各位
      

  4.   

    http://blog.csdn.net/treeroot/articles/171786.aspx
    我觉得这些东西还是比较繁,不过用的机会也不多
      

  5.   

    to 楼上:
    这篇文章我看过
    我说一下我的测试代码:
    public void run() {
              while(true)
              {
              //当该行代码被注释掉,被Cache的对象最终,我可以通过强制GC,被回收掉,反之就不行
              //System.out.println(cacheObj);
              }
     }
    问这个问题的起因是在用Hibernate时,借助内存分析工具,发现有很多QueryTranslator对象被SessionFactoryImpl cache住了,不能释放,持续增长
    即使我的 所有page都logout后,也并没有被释放掉,所以猜测有可能我们的程序仍然有强应用cache中的对象,或者它的实现也许有问题