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

我得到这个例外:

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 documents = query.list(); query = session.createQuery("select o from Organization as o"); List organizations = query.list(); <---AT THIS LINE tx.commit(); 

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

如果我删除交易thingyexception消失。 这是怎么回事? 这是内存泄漏还是什么? 提前致谢。

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

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

为什么要尝试记录一个巨大的字符串? 我不能从您提供的信息中说出来,但我猜你的组织实体中有一些非常大的东西(可能是一个BLOB?)而Hibernate正在尝试记录查询从数据库中取出的对象。

最好的办法可能是关闭这个特定的日志记录function。 关于一个非常类似的问题存在一个问题,答案中有一些有用的建议。

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

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

 java -Xmx512m yourprog 

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

您需要增加JVM堆大小。 使用-Xmx256m命令行参数启动它。