java - hibernate session Evict方法是否立即释放内存资源;y

标签 java hibernate memory

我的应用程序使用 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/

相关文章:

java - Apache Nifi 读取处理器中的配置属性

java - 使用 Hibernate 进行用户身份验证

java - 没有名为 testPU 的 EntityManager 的持久性提供程序

导致编译错误的类的 c++ mutex 成员

memory - 堆栈帧是如何以及何时构建的?

Java 长空字符串

java - 无法将红蜘蛛 WebSocket 连接到 Java ServerSocket

java - 如何访问另一个布局的元素?

java - JPA/Hibernate继承没有id

c - 使用 uint32_t* 更改 uint8_t 数组的值