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

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

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

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

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


当前回答

在Intellij中,我只需要给出"Build Project"

其他回答

VM参数在eclipse中为我工作。如果您使用的是eclipse 3.4版本,请执行以下操作

运行——>运行配置——>然后选择maven build下的项目——>然后选择选项卡“JRE”——>然后输入-Xmx1024m。

或者你可以运行——>运行配置——>选择“JRE”选项卡——>然后输入-Xmx1024m

这将增加所有构建/项目的内存堆。以上内存大小为1gb。你可以按照你想要的方式进行优化。

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

详情请看这里。

我在其他地方读到过,你可以尝试- catch java.lang.OutOfMemoryError,在catch块上,你可以释放所有你知道可能使用大量内存的资源,关闭连接等等,然后执行System.gc(),然后重新尝试你要做的任何事情。

另一种方式是,虽然,我不知道这是否会工作,但我目前正在测试它是否会在我的应用程序上工作。

这个想法是通过调用System.gc()来进行垃圾收集,这可以增加可用内存。您可以在内存消耗代码执行之后继续检查。

//Mimimum acceptable free memory you think your app needs
long minRunningMemory = (1024*1024);

Runtime runtime = Runtime.getRuntime();

if(runtime.freeMemory()<minRunningMemory)
 System.gc();

对于netbeans,您可以设置最大堆大小来解决这个问题。

转到“运行”,然后——>“设置项目配置”——>“自定义”——>“运行”其弹出窗口——>“虚拟机选项”——>填写“-Xms2048m -Xmx2048m”。

您可以指定每个项目需要多少堆空间

以下是日食太阳神/朱诺/开普勒:

鼠标右键单击

 Run As - Run Configuration - Arguments - Vm Arguments, 

然后加上这个

-Xmx2048m