【发布时间】:2016-01-09 12:11:06
【问题描述】:
我正在使用 JAXB 将 java 对象编组和解组为 xml,反之亦然。 我正在编组的对象具有字节数组属性。如果字节数组的大小很大,我会得到 OOM。
这是我正在做的编组:
StringWriter writer = new StringWriter();
jaxbContext = JAXBContext.newInstance("package name");
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
jaxbMarshaller.marshal(myObject, writer);
return writer.toString();
我上线的错误:
jaxbMarshaller.marshal(myObject, writer);
这是堆栈跟踪:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at java.io.StringWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.cleanUp(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(Unknown Source)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)
这里是java内存统计:
uintx AdaptivePermSizeWeight = 20 {product}
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 90006400 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 1440743424 {product}
uintx MaxPermSize = 85983232 {pd product}
uintx PermSize = 21757952 {pd product}
intx ThreadStackSize = 0 {pd product}
intx VMThreadStackSize = 0 {pd product}
非常感谢任何帮助。
【问题讨论】:
-
你当前的堆和内存设置是什么?您正在运行应用程序还是网络应用程序?
-
@Tim Biegeleisen 你能告诉我如何检查当前的堆和内存设置吗?它是一个网络应用程序
-
将可能很大的 myObject 编组到内存中的字符串可能会导致 OOM。为什么不编组到文件?
-
@ShekharKhairnar 你对这篇文章有什么期望——你的问题是什么?如果您期望如何快速解决问题,那么答案将是扩展 JVM 内存。如果您想知道这个问题的根本原因,那么您可能应该阅读 JAXB 的来源,但我认为您可能会偶然发现我发现的错误 stackoverflow.com/questions/31927533/…
标签: java jaxb marshalling