【问题标题】:Does hibernate session Evict method free up memory resources immediatel;y休眠会话驱逐方法是否立即释放内存资源;y
【发布时间】: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);
        }

【问题讨论】:

    标签: java hibernate memory


    【解决方案1】:

    Evict 确实会从休眠会话中移除实体。根据您粘贴的代码,它最终会被垃圾回收。

    如果没有更多信息,您将无法修复 outOfMemory 错误。使用以下选项启动 VM:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=_change_me_

    当发生 OutOfMemoryError 时,分析内存转储(例如使用 eclipse memory analyzer)并查看使用这么多 RAM 的原因。

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多