如何通过环境变量设置 Java 的最小和最大堆大小?

Posted

技术标签:

【中文标题】如何通过环境变量设置 Java 的最小和最大堆大小?【英文标题】:How do I set Java's min and max heap size through environment variables? 【发布时间】:2010-09-29 20:24:43 【问题描述】:

我知道在启动 java 时可以设置堆大小,但我想通过我的服务器上的环境变量进行调整。

【问题讨论】:

接受的答案已过时,不再适用。如果您最终来到这里,请参阅@Gauthier 的回答 【参考方案1】:

你不能直接使用环境变量来做到这一点。您需要使用传递给 java 命令的一组“非标准”选项。运行:java -X 了解详情。您正在寻找的选项是 -Xmx 和 -Xms(这是“初始”堆大小,因此可能是您正在寻找的。)

某些产品(如 Ant 或 Tomcat)可能带有用于查找 JAVA_OPTS 环境变量的批处理脚本,但它不是 Java 运行时的一部分。如果您使用其中一种产品,您可以设置如下变量:

set JAVA_OPTS="-Xms128m -Xmx256m"  

您也可以使用自己的命令行来采用这种方法,例如:

set JAVA_OPTS="-Xms128m -Xmx256m"  
java $JAVA_OPTS MyClass

【讨论】:

maven appassemble 插件生成的脚本也使用了JAVA_OPTS 技术。 正如@neves 在下面的评论中提到的,这在 java 7 (docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/…) 中发生了变化。您可以使用 JAVA_TOOL_OPTIONS(请参阅下面的链接和答案)【参考方案2】:

如果您希望任何 java 进程(而不仅仅是 ant 或 Tomcat)选择像 -Xmx 这样的选项,请使用环境变量 _JAVA_OPTIONS

在 bash 中:export _JAVA_OPTIONS="-Xmx1g"

【讨论】:

完美,效果很好,节省了我很多时间。 在 Windows 中:set _JAVA_OPTIONS=-Xmx1g 要使其永久化,make a new environment variable _JAVA_OPTIONS 并将其设置为 -Xmx1g 另见Difference between _JAVA_OPTIONS and JAVA_TOOL_OPTIONS【参考方案3】:

实际上,有一种方法可以通过环境变量为 Sun 的 JVM 设置全局默认值。

见How to set a java system property so that it is effective whenever I start JVM without adding it to the command line arguments。

【讨论】:

【参考方案4】:

您可以使用JAVA_TOOL_OPTIONS

例子:

export JAVA_TOOL_OPTIONS=-Xmx512m

在某些 cmets 和 another answer 中已提及。

OP 的问题已经很老了,但由于它是该问题的第一个谷歌结果,为了清楚起见,我想我会在这里添加答案。

【讨论】:

【参考方案5】:

你不能使用环境变量来做到这一点。它是通过“非标准”选项完成的。运行:java -X 了解详情。您正在寻找的选项是 -Xmx-Xms(这是“初始”堆大小,所以可能是您正在寻找的。)

【讨论】:

它看起来在 Java 7 中发生了变化:docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/…【参考方案6】:

我认为您唯一的选择是将 java 包装在一个脚本中,该脚本将环境变量替换为命令行

【讨论】:

【参考方案7】:

几点说明:

    Apache ant 对 JAVA_OPTS 一无所知,而 Tomcat 的启动脚本则知道。对于 Apache ant,使用 ANT_OPTS 来影响运行 /ant/ 的 JVM 的环境,但不会影响 ant 可能启动的东西。

    您可以设置的最大堆大小完全取决于环境:对于大多数 32 位系统,您可以请求的最大堆空间量(无论可用内存如何)都在 2GiB 范围内。 64 位系统上的最大堆“非常大”。此外,您实际上也受到物理内存的限制,因为堆由 JVM 管理,您不希望在磁盘上进行大量交换。

    对于服务器环境,您通常希望将 -Xms 和 -Xmx 设置为相同的值:这会将堆的大小固定为某个大小,并且垃圾收集器要做的工作更少,因为堆会永远不必重新调整大小。

【讨论】:

以上是关于如何通过环境变量设置 Java 的最小和最大堆大小?的主要内容,如果未能解决你的问题,请参考以下文章

eclipse 出错,环境变量配置好了,有的时候可以用,有的时候就会报如下错误为啥

JVM启动参数

手动实现最小堆和最大堆(优先队列)

“OutOfMemoryError”的其他原因?

JVM调优常用参数配置

我可以设置从 jar 文件运行的 Java 最大堆大小吗?