我对JVM和堆空间的了解有限,因此我试图了解我们所看到的某些行为。
在某些情况下,用户可以请求超出我们的堆空间的数据,从而导致OOM:Java堆空间。好的,这很有意义,我们知道为什么会这样。
OOM发生后,我注意到所报告的正在使用的内存量是堆大小+我们的应用程序正常运行的时间...但是,在OOM之后,它似乎没有被垃圾回收并恢复正常内存级别;它只是保持高。那是预期的吗?道歉这么简单的问题,我不确定在哪里可以找到此信息。
谢谢。
编辑:
这就是代码的根源-我们(错误地)允许用户获取太大的范围,并且当我们尝试返回对象的<List>
时,会引起OOM错误(至少这是我的理论) )
这段代码中的哪些内容会导致对象无法清理?
public List<Class> getClassesByRange(Timestamp startDate, Timestamp endDate) {
final Session session = this.sessionManager.openNewSession();
try {
final Criteria criteria = session.createCriteria(Class.class);
criteria.addOrder(Order.desc("sorting"));
criteria.setFetchMode("someObject", FetchMode.JOIN);
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
criteria.add(Restrictions.ge("createDateTime", startDate));
criteria.add(Restrictions.le("createDateTime", endDate));
return criteria.list();
} finally {
session.close();
}
}