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 个,则其他的工作正常。
如果我删除事务,那么异常就会消失。这是怎么回事?这是内存泄漏还是什么?提前致谢。
我从多年来对这类事情的痛苦中得到了一个提示:答案通常被小心地隐藏在堆栈跟踪的前 10 行中。始终多次阅读堆栈跟踪,如果这没有提供足够的帮助,请阅读发生故障的方法的源代码。
在这种情况下,问题来自 Hibernate 漂亮的打印机中的某个地方。这是一个日志功能,所以问题是 Hibernate 试图记录一些巨大的字符串。请注意在尝试增加 StringBuilder 的大小时它是如何失败的。
为什么它试图记录一个巨大的字符串?我不能从你提供的信息中说出来,但我猜你的组织实体中有一些非常大的东西(可能是 BLOB?),并且 Hibernate 正在尝试记录查询已从数据库中提取的对象. 这也可能是映射中的错误,即刻意获取会引入许多依赖对象——例如,由于外键定义错误而加载整个表的子集合。
如果映射中有错误,修复映射将解决问题。否则,最好的办法可能是关闭此特定的日志记录功能。有一个关于非常相似问题的现有问题,答案中有一些有用的建议。