讨论一段关于java内存管理的代码
讨论一段关于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);
}
}
}
问题点数:200、回复次数:7Top
1 楼infowain(infowain)回复于 2006-02-16 11:54:32 得分 50
你的main执行完毕后,tester会被回收Top
2 楼Octer()回复于 2006-02-16 12:11:53 得分 0
继续!Top
3 楼TinyJimmy(Jimmy)回复于 2006-02-16 13:19:18 得分 50
tester会被回收. 经过编译器优化后, MyThread的cacheObj真正存在对象句柄Top
4 楼treeroot(旗鲁特)回复于 2006-02-17 09:07:37 得分 50
这里设计到软引用,楼主是否已经了解了引用(强引用,弱引用,软引用,虚引用)的概念是关键Top
5 楼Octer()回复于 2006-02-17 12:18:36 得分 0
楼上的,对于这些原理我是知道的,但有一点不是很明白就是
对于softCache中的Object如果没有被应用,强制GC,是否应该都被回收
我的测试是结果是被回收的,但又有些不相信我写的测试程序
呵呵,所以求证各位Top
6 楼treeroot(旗鲁特)回复于 2006-02-17 12:35:00 得分 50
http://blog.csdn.net/treeroot/articles/171786.aspx
我觉得这些东西还是比较繁,不过用的机会也不多Top
7 楼Octer()回复于 2006-02-17 15:06:37 得分 0
to 楼上:
这篇文章我看过
我说一下我的测试代码:
public void run() {
while(true)
{
//当该行代码被注释掉,被Cache的对象最终,我可以通过强制GC,被回收掉,反之就不行
//System.out.println(cacheObj);
}
}
问这个问题的起因是在用Hibernate时,借助内存分析工具,发现有很多QueryTranslator对象被SessionFactoryImpl cache住了,不能释放,持续增长
即使我的 所有page都logout后,也并没有被释放掉,所以猜测有可能我们的程序仍然有强应用cache中的对象,或者它的实现也许有问题
Top




