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

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

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

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

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


当前回答

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

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

其他回答

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

注意,如果您在部署情况下需要这样做,请考虑使用Java WebStart(使用“ondisk”版本,而不是网络版本——可能在Java 6u10或更高版本中),因为它允许您以跨平台的方式向JVM指定各种参数。

否则,你将需要一个特定于操作系统的启动器来设置你需要的参数。

如果其他方法都失败了,除了增加最大堆大小外,还要尝试增加交换大小。对于Linux,到目前为止,相关说明可以在https://linuxize.com/post/create-a-linux-swap-file/中找到。

如果你在嵌入式平台上编译一些大的东西,这会很有帮助。

大警告----在我的办公室,我们发现(在一些windows机器上)我们不能为Java堆分配超过512m。事实证明,这是由于其中一些机器上安装了卡巴斯基反病毒产品。在卸载该AV产品后,我们发现我们可以分配至少1.6gb,即-Xmx1600m (m是强制性的,否则它将导致另一个错误“太小的初始堆”)工作。

不知道这种情况是否发生在其他反病毒产品上,但据推测,这是因为反病毒程序在每个地址空间中保留了一小块内存,从而防止了单个真正大的分配。

遵循以下步骤:

从tomcat/bin打开catalina.sh。 将JAVA_OPTS更改为 JAVA_OPTS = " -Djava.awt。无头= true -Dfile。encoding=UTF-8 -server -Xms1536m -Xmx1536m -XX:NewSize=256 6m -XX:MaxNewSize=256 6m -XX:PermSize=256 6m - xx: MaxPermSize = 256 - xx: + DisableExplicitGC” 重新启动tomcat