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

bun*_*112 0 java memory hibernate

我得到这个例外:

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)
Run Code Online (Sandbox Code Playgroud)

在此代码:

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();
Run Code Online (Sandbox Code Playgroud)

我连续进行了 2 次查询。如果我注释掉其中的 1 个,则其他的工作正常。

如果我删除事务,那么异常就会消失。这是怎么回事?这是内存泄漏还是什么?提前致谢。

And*_*cer 7

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

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

为什么它试图记录一个巨大的字符串?我不能从你提供的信息中说出来,但我猜你的组织实体中有一些非常大的东西(可能是 BLOB?),并且 Hibernate 正在尝试记录查询已从数据库中提取的对象. 这也可能是映射中的错误,即刻意获取会引入许多依赖对象——例如,由于外键定义错误而加载整个表的子集合。

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

  • 这是正确的答案,打印机只是向下运行结构,直到它加载整个数据库。(我打赌该组织有一些收藏品) (2认同)