Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JAXB封送时出现内存不足错误_Java_Jaxb_Marshalling - Fatal编程技术网

Java 使用JAXB封送时出现内存不足错误

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

我使用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}

非常感谢您的帮助。

请使用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的源代码,但我认为您可能会偶然发现我发现的错误