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

565

我正在使用Java 5编写客户端的Swing应用程序(图形字体设计器)。最近,由于我在内存使用上没有保守,因此遇到了java.lang.OutOfMemoryError: Java heap space 错误。用户可以打开无限数量的文件,而程序会将已打开的对象保存在内存中。经过快速研究,我发现在Windows机器上JVM默认的最大堆大小为64MB,详情请参阅Java虚拟机5.0中的人体工程学等文献。

鉴于这种情况,我应该如何处理这个限制呢?

我可以使用命令行选项最大堆大小增加到可用RAM,然后编写一些启动程序或脚本。但是,增加到一些有限的最大值并不能彻底解决问题。

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

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


默认的最大堆大小为64 MB,这是在J2SE 5.0之前的设置。有关J2SE 8.0信息,请参阅"http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html"上的“垃圾收集器人体工程学”。 - Andy Thomas
5
如果您因为每个OOM问题都被重复到这个问题而来到这里,请确保您也查看以下内容:https://dev59.com/SnVC5IYBdhLWcg3wbQfA 它提供了一种在OOM之前“及时”清理内存引用的解决方案。SoftReferences可能是解决您实际问题的工具。 - Steve Steiner
Sun/Oracle JVM 一直非常严格地规定要使用多少内存(如果不规定,则会使用一些有趣的默认值)。那是微软 JVM 的其中一个好处 - 它非常快速,并且可以使用机器拥有的任何内存。 - Thorbjørn Ravn Andersen
在我的情况下,我错过了将 gradle.properties 文件添加到我的项目中。 - Mohd Qasim
31个回答

0

如果在启动eclipse birt时出现此错误: 1- 您将进入eclipse配置文件 2- 您必须打开eclipse.init 3- 修改RAM内存,您可以增加该内存,我提供一个例子。

我的旧信息是: -Xmx128m -XX:MaxPermSize=128m

我进行的新修改:

-Xmx512m -XX:MaxPermSize=512m

这个修改将允许我在浏览器中启动报告时解决Java堆空间问题。

谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接