OutOfMemoryError:java.util.Arrays.copyOfRange中的Java堆空间

时间:2013-09-11 04:08:46

标签: java gwt errai

这是在使用String param将图像base64字符串(大小约为360KB)传递给GWT方法时在GWT DevMode控制台中抛出的错误:

  

java.lang.OutOfMemoryError:Java堆空间at   java.util.Arrays.copyOfRange(Arrays.java:2694)at   java.lang.String。(String.java:234)at   java.lang.StringBuilder.toString(StringBuilder.java:405)at   org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl $ 23._marshall1(MarshallerFactoryImpl.java:1310)     在   org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl $ 23.marshall(MarshallerFactoryImpl.java:1326)     在   org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl $ 23.marshall(MarshallerFactoryImpl.java:1)     在   org.jboss.errai.marshalling.client.marshallers.QualifyingMarshallerWrapper.doNotNullMarshall(QualifyingMarshallerWrapper.java:93)     在   org.jboss.errai.marshalling.client.marshallers.AbstractNullableMarshaller.marshall(AbstractNullableMarshaller.java:29)     在   org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl $ 24.marshall(MarshallerFactoryImpl.java:1402)     在   org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl $ 24.marshall(MarshallerFactoryImpl.java:1)     在   org.jboss.errai.marshalling.client.Marshalling.toJSON(Marshalling.java:83)     在   org.jboss.errai.enterprise.client.jaxrs.MarshallingWrapper.toJSON(MarshallingWrapper.java:32)     在   org.jboss.errai.enterprise.client.jaxrs.JaxrsProxyLoaderImpl $ 1com_myapp_client_shared_service_PasteServiceImpl.createPaste(JaxrsProxyLoaderImpl.java:194)     在   com.myapp.client.local.PastePage.onPasteImage(PastePage.java:257)     在com.myapp.client.local.PastePage $ 4 $ 1.run(PastePage.java:162)     在com.google.gwt.user.client.Timer.fire(Timer.java:149)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:601)at   com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)     在   com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)     在   com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)     在   com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)     在   com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)     在   com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)     在   com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)     在   com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)     在   com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)     在com.google.gwt.core.client.impl.Impl.apply(Impl.java)at   com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)at at   sun.reflect.GeneratedMethodAccessor69.invoke(未知来源)

查看日志,它看起来不像是一个客户端问题,更像是一个编组问题。

2 个答案:

答案 0 :(得分:4)

这只是意味着JVM内存不足。发生这种情况时,您基本上有两个选择:

  • 允许JVM使用-Xmx VM参数使用更多内存。例如,允许JVM使用1 GB(1024 MB)的内存

  • 改进/修复应用程序,以便使用更少的内存

在许多情况下,例如在内存泄漏的情况下,第二个选项是唯一的声音选择。当应用程序对对象进行越来越多的引用并且永远不会释放它们时,就会发生内存泄漏。因此,垃圾收集器将永远不会收集这些对象,并且在我们到达没有足够的可用内存可供应用程序正常运行的点之前,可用的内存将越来越少。此时,JVM将抛出一个OOM。

尝试此解决方案。

答案 1 :(得分:0)

建议添加配置文件以在发生错误时捕获转储文件,并使用mat分析最终原因可能会有所帮助。