Java 使用JAXB封送时出现内存不足错误
我使用JAXB将java对象封送和解封为xml,反之亦然。 我正在封送的对象具有字节数组属性。如果字节数组的大小很大,我得到OOM 以下是我正在进行的编组:Java 使用JAXB封送时出现内存不足错误,java,jaxb,marshalling,Java,Jaxb,Marshalling,我使用JAXB将java对象封送和解封为xml,反之亦然。 我正在封送的对象具有字节数组属性。如果字节数组的大小很大,我得到OOM 以下是我正在进行的编组: StringWriter writer = new StringWriter(); jaxbContext = JAXBContext.newInstance("package name"); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller
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}
非常感谢您的帮助。请使用Java命令行参数
-Xms: initial heap size
-Xmx: Maximum heap size
如果您使用的是EclipseIDE。请查看以下链接
http://stackoverflow.com/questions/2294268/how-can-i-increase-the-jvm-memory
祝你好运请使用Java命令行参数
-Xms: initial heap size
-Xmx: Maximum heap size
如果您使用的是EclipseIDE。请查看以下链接
http://stackoverflow.com/questions/2294268/how-can-i-increase-the-jvm-memory
祝您好运您可以使用以下vm参数来增加jvm内存
-vmargs
-Xmx512m
-XX:MaxPermSize=384m
同样,要指定的值基于RAM内存的大小。对于具有3GB RAM/32位的机器,上述值是最佳值
这些vm参数需要作为命令行参数传递给java应用程序。如果您使用的是eclipse,请在运行配置中指定。您可以使用以下vm参数来增加jvm内存
-vmargs
-Xmx512m
-XX:MaxPermSize=384m
同样,要指定的值基于RAM内存的大小。对于具有3GB RAM/32位的机器,上述值是最佳值
这些vm参数需要作为命令行参数传递给java应用程序。如果您使用的是eclipse,则在运行配置中指定。或者,您可以在编组JAXB时使用流模式。详情请参阅以下帖子:
这种方法将防止应用程序在StringWriter对象中加载大量数据,从而导致此OutOfMemoryError或者,您可以在编组JAXB时使用流模式。详情请参阅以下帖子:
此方法将防止应用程序在StringWriter对象中加载大量数据,从而导致此OutOfMemoryError您当前的堆和内存设置是什么?你在运行应用程序还是web应用程序?@Tim Biegeleisen你能告诉我如何检查当前的堆和内存设置吗。。这是一个web应用程序,我们来看看,它讨论了如何做到这一点。另外请看一看。将一个可能很大的myObject编组到内存字符串中可能会导致OOM。你为什么不整理一个文件?@ShekharKhairnar你对这篇文章有什么期待?你的问题是什么?如果您期望如何快速解决问题,那么answear将扩展JVM内存。如果您想知道这个问题的根本原因,那么您可能应该阅读JAXB的源代码,但我认为您可能会偶然发现我发现的错误,您当前的堆和内存设置是什么?你在运行应用程序还是web应用程序?@Tim Biegeleisen你能告诉我如何检查当前的堆和内存设置吗。。这是一个web应用程序,我们来看看,它讨论了如何做到这一点。另外请看一看。将一个可能很大的myObject编组到内存字符串中可能会导致OOM。你为什么不整理一个文件?@ShekharKhairnar你对这篇文章有什么期待?你的问题是什么?如果您期望如何快速解决问题,那么answear将扩展JVM内存。如果您想知道这个问题的根本原因,那么您可能应该阅读JAXB的源代码,但我认为您可能会偶然发现我发现的错误