0

我有一个休眠实体:

@Entity
class Foo {
    //...
    @Lob
    public byte[] getBytes() { return bytes; }
    //....
}

我的 VM 配置为最大堆大小为 512 MB。当我尝试持久化具有 75 MB 大对象的对象时,我收到 OutOfMemoryError。

堆栈跟踪中的方法名称(StringBuilder、ByteArrayBlobType.toLoggableString、pretty.Printer.toString)表明 hibernate 正在尝试写入包含我的对象的非常大的日志消息。

我对为什么休眠使用这么多内存是正确的吗?解决此问题的最简单方法是什么?

java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:44)
at java.lang.StringBuilder.<init>(StringBuilder.java:81)
at org.hibernate.type.ByteArrayBlobType.toString(ByteArrayBlobType.java:117)
at org.hibernate.type.ByteArrayBlobType.toLoggableString(ByteArrayBlobType.java:127)
at org.hibernate.pretty.Printer.toString(Printer.java:53)
at org.hibernate.pretty.Printer.toString(Printer.java:90)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:97)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.jboss.seam.persistence.HibernateSessionProxy.flush(HibernateSessionProxy.java:181)
4

4 回答 4

3

我解决了这个问题。关闭日志记录确实解决了问题,但我不明白在 JBoss 应用程序服务器下运行时,服务器自己的 log4j.xml 文件会覆盖我在应用程序的类路径中放置的任何内容。

我打开了/jboss-4.2.3.GA/server/default/conf/log4.xml,并插入了这个:

<category name="org.hibernate">
    <priority value="ERROR"/>
</category>

这解决了我看到的问题。

于 2009-11-17T19:18:14.093 回答
0

What if you try the following two Hibernate properties?

hibernate.show_sql=false
hibernate.format_sql=false
于 2010-09-24T15:08:28.553 回答
0

第一个测试是看它是否真的是一个日志记录问题。你用的是什么记录器?如果是 log4j,那么您可以尝试使用 log4j.properties 文件中的以下行关闭 Hibernate 的所有日志记录:

log4j.logger.org.hibernate=关闭

这可能不是您的应用程序运行的最终理想方式,但它可能会帮助您测试日志记录是否是问题所在。

于 2009-11-17T17:38:07.633 回答
0

漂亮的打印机可能正在将字节转换为十六进制表示法(例如,'0x55 0xF3 ...)',因此对于 blob 中的每个字节,您将获得 4 个字节的输出,即 300M 的输出,以及缓冲以及 VM 中的其他内容可能会让你超过极限。

于 2009-11-17T17:41:09.530 回答