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

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

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

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

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


当前回答

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

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

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

其他回答

最终,无论您在哪个平台上运行,您总是有一个有限的堆的最大值可以使用。在Windows 32位中,这大约是2GB(不是具体的堆,而是每个进程的总内存)。只是碰巧Java选择将默认值设得更小(大概是为了让程序员创建的程序在内存分配失控的情况下不会遇到这个问题,并且必须检查它们正在做什么)。

因此,这里有几种方法可以用来确定需要的内存量或减少正在使用的内存量。使用垃圾收集语言(如Java或c#)的一个常见错误是保留对不再使用的对象的引用,或者分配许多可以重用的对象。只要对象有对它们的引用,它们就会继续使用堆空间,因为垃圾收集器不会删除它们。

在这种情况下,您可以使用Java内存分析器来确定程序中的哪些方法正在分配大量对象,然后确定是否有办法确保它们不再被引用,或者从一开始就不分配它们。我过去使用的一个选项是“JMP”http://www.khelekore.org/jmp/。

如果您确定分配这些对象是出于某种原因,并且需要保持引用(取决于您正在做什么,可能是这种情况),那么在启动程序时只需增加最大堆大小。但是,一旦您执行了内存分析并了解对象是如何分配的,您就应该更好地了解您需要多少内存。

In general if you can't guarantee that your program will run in some finite amount of memory (perhaps depending on input size) you will always run into this problem. Only after exhausting all of this will you need to look into caching objects out to disk etc. At this point you should have a very good reason to say "I need Xgb of memory" for something and you can't work around it by improving your algorithms or memory allocation patterns. Generally this will only usually be the case for algorithms operating on large datasets (like a database or some scientific analysis program) and then techniques like caching and memory mapped IO become useful.

如果这个错误在APK生成过程中出现在react-native中,cd到你的项目中的android文件夹,并执行:

./gradlew clean

then

./gradlew assembleRelease

如果错误仍然存在,那么重新启动计算机。

Android工作室

文件->无效缓存和重新启动解决了它为我:)

当数据库连接池满时,Java OOM堆空间问题也会出现。

我遇到这个问题是因为我的Hikari连接池(升级到Spring boot 2.4.*时)已满,无法再提供连接(所有活动连接仍在等待从数据库获取结果)。

问题是我们在JPA存储库中的一些本地查询包含ORDER BY ?#{#pageable},这需要很长时间才能获得升级时的结果。

从JPA存储库中的所有本机查询和OOM堆空间问题以及连接池问题中删除ORDER BY ?#{#pageable}。

如果你使用Android Studio,只需用gradle添加这些行。属性文件

org . gradle。jvmargs=- xm2048m -XX: maxpermze =512m -XX:+ heapdumpfdfile -Dfile.encoding=UTF-8