Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate-java.lang.OutOfMemoryError:java堆空间_Java_Hibernate_Memory - Fatal编程技术网

Hibernate-java.lang.OutOfMemoryError:java堆空间

Hibernate-java.lang.OutOfMemoryError:java堆空间,java,hibernate,memory,Java,Hibernate,Memory,我得到一个例外: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2882) at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100) at java.lang.Abstra

我得到一个例外:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
    at java.lang.StringBuilder.append(StringBuilder.java:119)
    at java.util.AbstractMap.toString(AbstractMap.java:493)
    at org.hibernate.pretty.Printer.toString(Printer.java:59)
    at org.hibernate.pretty.Printer.toString(Printer.java:90)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:97)
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:35)
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1114)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
在此代码处:

Query query = null;
        Transaction tx= session.beginTransaction();
        if (allRadio.isSelected()) {
            query = session.createQuery("select d from Document as d, d.msg as m, m.senderreceivers as s where m.isDraft=0 and d.isMain=1 and s.organization.shortName like '" + search + "' and s.role=0");
        } else if (periodRadio.isSelected()) {
            query = session.createQuery("select d from Document as d, d.msg as m, m.senderreceivers as s where m.isDraft=0 and d.isMain=1 and s.organization.shortName like '" + search + "' and s.role=0 and m.receivingDate between :start and :end");
            query.setParameter("start", start);
            query.setParameter("end", end);
        }
        final List<Document> documents = query.list();


        query = session.createQuery("select o from Organization as o");
        List<Organization> organizations = query.list(); <---AT THIS LINE
        tx.commit();
Query=null;
事务tx=会话.beginTransaction();
if(allRadio.isSelected()){
query=session.createQuery(“从文档中选择d作为d,选择d.msg作为m,选择m.senderReceiver作为s,其中m.isDraft=0和d.isMain=1,选择s.organization.shortName,如“+search+”,选择s.role=0”);
}else if(periodRadio.isSelected()){
query=session.createQuery(“从文档中选择d作为d,选择d.msg作为m,选择m.senderReceiver作为s,其中m.isDraft=0和d.isMain=1,选择s.organization.shortName作为“+”搜索+”,选择s.role=0,选择m.receivingDate介于:开始和:结束之间”);
query.setParameter(“开始”,开始);
query.setParameter(“end”,end);
}
最终列表文档=query.List();
query=session.createQuery(“从组织中选择o作为o”);

列表组织=query.List() 您需要增加JVM堆的大小。使用命令行参数启动它。

虽然这样的错误可能是内存泄漏的指示器,但也可能是由于程序内存使用率过高造成的

您可以尝试通过在命令行中添加以下参数来修改它(这将增加最大堆大小;根据需要调整512m):


如果它以这种方式消失,您的程序可能只需要超过默认大小(取决于平台);如果它再次出现(可能稍晚一点),你的某个地方就会出现内存泄漏。

我从多年的痛苦中得到了这样一个提示:答案通常被小心地隐藏在堆栈跟踪的前10行的某个地方。始终多次读取堆栈跟踪,如果这没有提供足够的帮助,请阅读发生故障的方法的源代码

在本例中,问题来自Hibernate的漂亮打印机中的某个地方。这是一个日志功能,所以问题是Hibernate试图记录一些巨大的字符串。请注意,当尝试增加StringBuilder的大小时,它是如何失败的

为什么它要记录一个巨大的字符串?我无法从您提供的信息中得出结论,但我猜您的组织实体中有一些非常重要的东西(可能是一个BLOB?),Hibernate正在尝试记录查询从数据库中提取的对象。这也可能是映射中的一个错误,即急切抓取会引入许多依赖对象,例如,由于外键定义错误而加载整个表的子集合


如果是映射中的错误,修复映射将解决问题。否则,您最好的选择可能是关闭这个特定的日志功能。还有一个非常类似的问题,答案中有一些有用的建议。

您的组织列表是否很大?我没有太多的内存。我改成了256m,还是一样。这段代码在一段时间内运行良好,我可能会意外地更改某些内容。我如何追踪这个内存泄漏?希望你有某种版本控制(git、svn等等)?基本步骤很简单:在相同的数据上尝试旧版本的软件;将第一个不再运行的版本与最后一个仍然运行且没有异常的版本进行比较;)。在实践中,这可能不是那么容易,因为其他很多事情可能也发生了变化。我刚开始学习编程,这是我电脑上的一个项目。没有旧版本。如果你还没有这样做,我真的建议使用版本控制系统,即使只在本地开发!git或mercurial非常适合这样做,因为除了本地工作副本之外,您不需要其他任何东西。一定要熟悉一点系统的可能性,并经常检查!但我们有点偏离了最初的主题:)。没有版本控制系统,但是,它真的很难跟踪意外的变化,没有明确的起点,我可以想到的…我的项目真的很小。我连续问了两个问题。如果我把其中一个注释掉,另一个就可以了。这是正确的答案,打印机只是沿着结构往下走,直到加载整个数据库。(我打赌这个组织内部有一些集合)除非你希望这个家伙能把整个数据库放在内存中,否则这个解决方案是不会成功的
java -Xmx512m yourprog