我在我的Java应用程序中遇到了内存使用问题,但是我无论如何也无法理解为什么垃圾回收器没有解决它。代码如下:
public void foo() {
for(int i=0; i<50000; i++) {
bar(i);
}
}
private void bar(int i) {
LargeObject o = new LargeObject();
...
dao.save(o);
}
我的问题是LargeObject实例没有被垃圾回收-为了识别这个问题,我用jprofiler进行了分析并查看了堆。LargeObject实例从未被类变量引用,事实上,在
bar()
之外它们没有被任何地方引用。我感觉像是在抓瞎,但这可能与事务的开始/结束有关吗?我尝试将bar()
更改为公共,并且使用Propogation.REQUIRES_NEW
进行注释,还将foo()
的注释更改为Propogation.NEVER
,但都没有成功。dao中的代码如下:
public void save(LargeObject o) {
hibernateTemplate.getSessionFactory().getCurrentSession().saveOrUpdate(o);
}
垃圾回收器肯定在运行,因为我在jprofiler中看到了它的活动。
foo()
花费约30分钟,bar()
花费36毫秒,垃圾回收大约每60秒激增一次。至于为什么我确定它们没有被垃圾回收 - 系统中没有任何引用LargeObject,但是当
foo()
执行时,堆上的实例数量却在增加。
dao.save(o);
- Azodious