我正在Java 5上编写一个客户端Swing应用程序(图形字体设计器)。最近,我遇到了Java .lang. outofmemoryerror: Java堆空间错误,因为我在内存使用上不保守。用户可以打开无限数量的文件,程序将打开的对象保存在内存中。在快速研究之后,我发现5.0 Java虚拟机和其他人说,在Windows机器上,JVM默认的最大堆大小为64MB。

在这种情况下,我应该如何处理这个约束呢?

我可以使用java的命令行选项增加最大堆大小,但这需要计算出可用的RAM并编写一些启动程序或脚本。此外,增加到某个有限最大值并不能最终摆脱这个问题。

我可以重写一些代码,频繁地将对象持久化到文件系统中(使用数据库也是一样),以释放内存。它可能会起作用,但可能也要做很多工作。

如果你能告诉我上述想法的细节或一些替代方案,如自动虚拟内存,动态扩展堆大小,那将是伟大的。


当前回答

在android/gradle.properties中添加以下代码:

org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true

其他回答

在android/gradle.properties中添加以下代码:

org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true

如果你来这里搜索这个问题从REACT NATIVE。

那我想你应该这么做

cd android/ && ./gradlew clean && cd ..

增加堆大小不是一个“修复”,它是一个“膏药”,100%临时。它会在其他地方再次崩溃。要避免这些问题,请编写高性能代码。

尽可能使用局部变量。 确保你选择了正确的对象(EX:选择String, StringBuffer和StringBuilder之间) 为你的程序使用一个好的代码系统(例如:使用静态变量VS使用非静态变量) 其他可以在你的代码中工作的东西。 尝试用多线程移动

如果这个问题发生在Wildfly 8和JDK1.8中,那么我们需要指定MaxMetaSpace设置而不是PermGen设置。

例如,我们需要在wildfly的setenv.sh文件中添加以下配置。 JAVA_OPTS = " $ JAVA_OPTS - xx: MaxMetaspaceSize = 256 "

欲了解更多信息,请查看Wildfly堆问题

在java中解决OutOfMemoryError的简单方法是通过使用JVM选项-Xmx512M来增加最大堆大小,这将立即解决您的OutOfMemoryError。这是我在Eclipse, Maven或ANT中得到OutOfMemoryError时的首选解决方案,因为基于项目的大小,您可以很容易地耗尽内存。

这是一个增加JVM最大堆大小的例子,如果你在java应用程序中设置堆大小,最好保持-Xmx与-Xms的1:1或1:1.5的比例。

导出 JVM_ARGS=“-Xms1024m -Xmx1024m”

参考链接