1

这是将图像 base64 字符串(大小约为 360KB)传递给带有字符串参数的 GWT 方法时在 GWT DevMode 控制台中引发的错误:

java.lang.OutOfMemoryError: java.util.Arrays.copyOfRange(Arrays.java:2694) 在 java.lang.String.(String.java:234) 在 java.lang.StringBuilder.toString(StringBuilder.java) 的 Java 堆空间:405) org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl$23._marshall1(MarshallerFactoryImpl.java:1310) at org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl$23.marshall(MarshallerFactoryImpl.java:1326 ) 在 org.jboss.errai.marshalling.client.marshallers.QualifyingMarshallerWrapper.doNotNullMarshall(QualifyingMarshallerWrapper.java:93) 在 org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl$23.marshall(MarshallerFactoryImpl.java:1) .jboss.errai.marshalling.client.marshallers.AbstractNullableMarshaller.marshall(AbstractNullableMarshaller.java:29) 在 org.jboss.errai.marshalling.client.api。MarshallerFactoryImpl$24.marshall(MarshallerFactoryImpl.java:1402) at org.jboss.errai.marshalling.client.api.MarshallerFactoryImpl$24.marshall(MarshallerFactoryImpl.java:1) at 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) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl。invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 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.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) 在 com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213) 在 sun.reflect.GeneratedMethodAccessor69.invoke(Unknown Source)

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

4

2 回答 2

4

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

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

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

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

试试这个解决方案。

于 2013-09-11T04:15:38.440 回答
0

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

于 2020-03-24T03:45:05.337 回答