我的应用程序使用 hibernate ,在创建报告时,我得到一个 hibernate session ,从数据库中一一加载每个小部件,提取我需要的信息,然后从 session 中逐出该项目。
虽然这可能不是最好的,但我这样做是因为可能有很多小部件,如果我尝试一次性加载太多小部件,我可能会耗尽内存。我对 evict() 的理解是,与该项目关联的任何资源都将从 hibernate session 中删除。因为歌曲字段随后与下一条记录关联,所以唯一不能被垃圾收集的是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);
}
最佳答案
Evict 确实会从 hibernate session 中删除实体。从您粘贴的代码来看,它最终将被垃圾收集。
如果没有更多信息,您将无法修复内存不足错误。使用以下选项启动虚拟机:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=_change_me_
当发生 OutOfMemoryError 时,分析内存转储(例如使用 eclipse memory analyzer )并查看是什么使用了这么多 RAM。
关于java - hibernate session Evict方法是否立即释放内存资源;y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32562360/