当前位置: 首页 > 面试题库 >

休眠-java.lang.OutOfMemoryError:Java堆空间

巢德华
2023-03-14
问题内容

我得到这个例外:

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();

我连续2次查询。如果我评论其中之一,其他工作正常。

如果我删除交易,那么事物异常便消失了。这是怎么回事?这是内存泄漏之类的吗?提前致谢。


问题答案:

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

在这种情况下,问题出在Hibernate漂亮打印机中的某个地方。这是一个日志记录功能,因此问题在于Hibernate试图记录一些巨大的字符串。请注意,在尝试增加StringBuilder的大小时它如何失败。

为什么要尝试记录巨大的字符串?我不能从您提供的信息中说出来,但是我想您的组织实体中有很大的内容(也许是BLOB吗?),Hibernate尝试记录查询已从数据库中拉出的对象。映射中也可能是错误的,因为渴望进行提取会拉入许多相关的对象-
例如,由于错误的外键定义,导致加载整个表的子集合。

如果映射错误,则修复映射将解决问题。否则,最好的选择是关闭此特定的日志记录功能。在一个非常相似的问题上存在一个现有的问题,答案中有一些有用的建议。



 类似资料:
  • 问题内容: 我在执行多线程程序时遇到以下错误 上面的错误发生在其中一个线程中。 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。 有什么办法可以增加堆空间? 我应该对程序进行哪些更改,以使其占用更少的堆空间? 问题答案: 如果要增加堆空间,可以 -在命令行上使用。默认情况下,这些值基于JRE版本和系统配置。你可以在Ja

  • 当我使用spark运行一个模型训练管道时,我产生了上面的错误 oom错误由org.apache.spark.util.Collection.ExternalSorter.WritePartitionedFile(ExternalSorter.Scala:706)触发(在堆栈跟踪的底部) 日志: 任何建议都会很棒:)

  • 为我的人工智能类编写一段代码,它旨在列出所有可能的状态,给出三个水壶的水壶问题(你可以装满任何一个水壶,或者把一个水壶倒入另一个水壶,或者清空任何一个水壶,你想要多少次就多少次,以任何顺序),从空水壶开始。 出于某种原因,在记录了88个看似不同的状态后,第89个状态与第一个状态相同,我最终用完了空间,因为它在循环。 我想这与我如何检查状态是不同的有关,但我不能弄清楚。任何帮助都将不胜感激。 }

  • 问题内容: 如何处理“ java.lang.OutOfMemoryError:Java堆空间”错误? 问题答案: 最终,无论你在什么平台上运行,都始终可以使用有限的最大堆。在Windows 32位环境中2GB(不是专门用于堆,而是每个进程的内存总量)。碰巧的是,Java选择减小默认值(大概是为了让程序员在没有遇到这个问题且不必仔细检查它们在做什么的情况下,无法创建内存分配失控的程序)。 因此,考虑

  • 问题内容: 将Hibernate-spatial升级到5.0.0.CR2版本后,以下声明不再起作用: 与: 如我所见,该类不再存在于Jar文件中。GeometryType发生了什么以及如何替换?还是要包含另一个jar文件? 编辑:为澄清。我正在结合使用Hibernate-Spatial和PostgreSQL-Postgis数据库。 问题答案: 那么解决方案太容易看到了。只需删除@Type批注,则声

  • 问题内容: 我在Java Web应用程序中有一个线程,它导致 java.lang.OutOfMemoryError:Java堆空间 异常,但是try / catch块无法捕获该错误。 样例代码: 输出: 背景: 我最近接手了这个Java项目,并试图跟上Java和这个项目的发展。我是C#开发人员,所以我还不熟悉这个项目或Java。我知道我可以使用- Xmx设置来修复该错误,但我有兴趣捕获此错误,因此