如何处理 "java.lang.OutOfMemoryError: Java heap space" 错误?

39 浏览
0 Comments

如何处理 "java.lang.OutOfMemoryError: Java heap space" 错误?

我正在使用Java 5编写客户端的Swing应用程序(图形字体设计器)。最近,我遇到了java.lang.OutOfMemoryError: Java heap space错误,因为我在内存使用方面没有保守。用户可以打开无限数量的文件,程序将打开的对象保留在内存中。经过快速研究,我发现Java虚拟机5.0中的自适应性和其他一些资料说,在Windows机器上,JVM将默认最大堆大小设置为64MB

在这种情况下,我该如何应对这个限制呢?

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

我可以重写一些代码,频繁地将对象持久化到文件系统中(使用数据库也是一样的),以释放内存。这可能可行,但也可能需要付出很多努力。

如果你能向我指出上述想法的详细信息或类似自动虚拟内存,动态扩展堆大小的替代方案,那就太好了。

admin 更改状态以发布 2023年5月23日
0
0 Comments

使用命令行选项-Xmx运行Java,设置堆的最大大小。

在这里查看详细信息。

0
0 Comments

无论在哪个平台上运行,最终你总是有一个有限的最大堆可以使用。在Windows 32位中,这大约是2GB(不是特定的堆,而是每个进程的总内存量)。恰巧Java选择使默认值较小(可能是为了防止程序员创建具有无限制内存分配的程序而遇到此问题,并不得不检查他们正在做的事情)。

因此,在这种情况下,你可以采取几种方法来确定需要的内存量或减少使用的内存量。在像Java或C#这样的垃圾收集语言中,常见的错误是保留对你不再使用的对象的引用,或在可以重用它们的情况下分配许多对象。只要对象有引用,它们就会继续使用堆空间,因为垃圾收集器不会删除它们。

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

如果确定您之所以要分配这些对象是由于某种原因并且需要保留引用(这可能是情况),则需要在启动程序时增加最大堆大小。但是,一旦进行了内存分析并了解了如何分配您的对象,您应该更清楚自己需要多少内存。

总的来说,如果无法保证您的程序将在某个有限的内存量下运行(也许取决于输入大小),则始终会遇到此问题。只有在尽了一切努力之后,您才需要查看将对象缓存到磁盘等。此时,您应该有一个非常好的理由来说“我需要XGB的内存”以及无法通过改进算法或内存分配模式来解决它。通常,这只会在操作大型数据集(如数据库或某些科学分析程序)的算法中发生,并且诸如缓存和内存映射IO之类的技术变得有用。

0