讨论一段关于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);
}
}
}
代码:
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);
}
}
}
解决方案 »
- 两个线程的讨论问题
- JavaScript正则表达式的一个问题
- 求教空色字体的地方,为什么这么表示是代表 8和 2 之间的数?
- DatagramSocket 自己给自己发消息包有异常
- JAVA基础之类、接口
- 请教java如何调用outlook?我会传入收件人的地址,用户点我的button之后我会打开outlook然后把收件人的地址传入?
- HasnMap的问题
- java中如何改变实参内容?
- 更换JPanel时,第一下有问题,然后就正常了。。
- 如何同时监听本机的多个端口
- String s = new String("xyz");创建了几个String Object?
- 有关JEditorPane. 急!!!
对于softCache中的Object如果没有被应用,强制GC,是否应该都被回收
我的测试是结果是被回收的,但又有些不相信我写的测试程序
呵呵,所以求证各位
我觉得这些东西还是比较繁,不过用的机会也不多
这篇文章我看过
我说一下我的测试代码:
public void run() {
while(true)
{
//当该行代码被注释掉,被Cache的对象最终,我可以通过强制GC,被回收掉,反之就不行
//System.out.println(cacheObj);
}
}
问这个问题的起因是在用Hibernate时,借助内存分析工具,发现有很多QueryTranslator对象被SessionFactoryImpl cache住了,不能释放,持续增长
即使我的 所有page都logout后,也并没有被释放掉,所以猜测有可能我们的程序仍然有强应用cache中的对象,或者它的实现也许有问题