【发布时间】:2015-09-14 10:18:44
【问题描述】:
我的应用程序使用休眠,在创建报告时我得到一个休眠会话,从数据库中加载每个小部件,提取我需要的信息,然后从会话中逐出项目。
虽然这可能不是最好的,但我这样做是因为可能有很多小部件,如果我尝试一次加载太多小部件,我可能会耗尽内存。我对 evict() 的理解是,与该项目关联的任何资源都将从休眠会话中删除。而且因为歌曲字段随后与下一条记录相关联,所以唯一不能被垃圾收集的是 folderToSongIds 映射
但是,当 recNos 很大时,我仍然有时会在此代码中看到 OutofMemory 错误。
我想这可能只是因为 recNos/folderToSongIds 变量的大小,但它们不存储太多大对象,所以我想检查 evict() 是否符合我的要求,看看是否还有其他我可以做的事情使用更少的内存。
try
{
session = com.jthink.songlayer.hibernate.HibernateUtil.getSession();
//For each song group by its parent
for (Integer next : recNos)
{
//Group songs changed by parent folder
Song song = SongCache.loadSongFromDatabase(session, next);
File file = new File(song.getFilename());
folderToSongIds.put(file.getParent(), song.getRecNo());
session.evict(song);
}
}
catch (Throwable t)
{
Errors.addError("Unable to do complete Report:"+t.getMessage());
}
finally
{
HibernateUtil.closeSession(session);
}
【问题讨论】: