在Mac OS X上更改Java的最大内存堆

15

我正在尝试更改 Mac OS X 上 Java 的最大内存大小“heap”。我已经阅读了很多关于修改“-XX:MaxPermSize”的文章,但我找不到该文件并不知道如何更改该设置。


3
为什么这里要使用“scala”标签?如果你正在运行Scala,那么答案与Java不完全相同(如果你使用的是scala而不是java -cp /.../scala-library.jar:...)。 - Rex Kerr
我过去所做的是将/bin/java移动到/bin/realjava,然后创建一个shell脚本/bin/java,该脚本使用某些默认设置调用真实的脚本。但是,我不建议这样做。你最好根据每个JVM的确切要求进行调整。 - opyate
5个回答

13

您可以使用以下参数设置Java虚拟机可用的内存:

-Xms64m -Xmx200m

-Xms指定最小内存,-Xmx指定最大内存。

你需要在运行应用程序时指定它们。例如,如果你有一个名为app.jar的jar包,可以键入以下命令来运行它

java -Xms64m -Xmx512m -jar app.jar

我认为在32位机器上,你不能给JVM超过1GB的内存。


1
如果您使用集成开发环境,您可能可以将这些参数设置到项目的设置中。例如,在Eclipse中,您可以通过单击“运行”->“运行配置”来完成此操作。 - smellyarmpits
为什么只有1G?理论上不应该是3G或4G吗? - om-nom-nom
使用32位架构,您可以拥有最大4GB的物理内存,但应用程序、进程等可用内存取决于许多因素。例如,操作系统需要一定量的内存来处理系统进程等。我不知道虚拟内存限制来自哪里,很抱歉。无论如何,我认为它也取决于您当前使用的操作系统。在Windows下,我从未能够将VM分配超过1GB的内存。 - smellyarmpits
我在谈论1GB,但实际上我不记得确切的数量是多少。 - smellyarmpits
2
在 OS X Mavericks 上,默認的 Java 安裝不支持 -Xsm64m。我們省略了這個選項,一切都運作正常。 - CVertex

10

我正在使用WEKA,遇到了同样的问题。 在这里,我找到了解决方案,而且很容易。

进入应用程序==> 左键单击特定应用程序(例如Weka)==> 显示包内容==> 内容==> Info.Plist==> Java==> VMOptions==> 根据需要增加内存大小(在我的Mac上,默认为1 GB,我增加到了6 GB)


1
我更喜欢这个答案,因为它直接简单,并且提供了一个永久的解决方案。 - Jason F

2

我曾在终端中尝试运行一个具有极大数组的Java程序。但是它一直提示内存不足,后来我通过增加每个线程允许使用的内存大小解决了这个问题:

$ java -Xss12G name

这里的-Xss12G告诉Java运行时为每个线程分配12GB内存,然后运行name。同样,-Xss4G使用每个线程4GB内存。符号$Terminal控制台提示,可能会显示文件夹和你的名字。
注意:如果你没有使用线程,那么你正在为当前程序或你正在运行的主线程分配内存。
在终端中输入命令java -X可以获取有关分配堆和线程内存的更多详细信息。
$ java -X

2

通过使用-Xmx开关设置最大堆大小。

-XX:MaxPermSize用于指定永久代的最大大小,它是总堆的子集。


-Xmx开关不能全局改变内存大小,它只能针对一个类进行操作。我想知道如何全局更改所有脚本的内存分配。 - user1435853
2
@user1435853 你在哪里看到 -Xmx 不是全局的?它适用于整个 JVM。 - Jim Garrison
我应该编辑哪个文件来设置“-XX:MaxPermSize”?除非我指定一个类,否则“java -Xmx”命令对我没有用。它不会全局改变堆内存设置。 - user1435853
2
不存在所谓的“全局”设置。JVM 有一个默认值,你可以在调用它时覆盖它。 - matt b

1
如果您从终端启动应用程序,则需要在命令行上提供参数:
java -XX:MaxPermSize=128m ...

这与任何其他平台上的情况相同。

如果您需要为应用程序包设置此项(即,看起来像常规双击 Mac 应用程序的 Java 应用程序),则需要编辑 info.plist 文件,该文件位于包内并且通常不可见。

此页面 提供了有关如何在 IntelliJ 中执行此操作的说明,但也适用于其他捆绑的 Mac Java 应用程序。


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