在Java中增加堆大小

334

我正在使用8 GB RAM的Windows 2003服务器(64位),如何增加堆内存最大值?我正在使用-Xmx1500m标志将堆大小增加到1500 Mb。我能否将堆内存增加到物理内存的75%(6 GB堆)?


5
你尝试过使用“-Xmx6g”吗?这个方法没有起作用吗?你观察到了什么情况? - oxbow_lakes
4
你尝试增加堆内存但失败了吗?你使用的是64位的JVM吗? - Bart Kiers
谢谢您的评论,但这并不起作用。 - Sunil
1
那么 - 你怎么知道它不工作?JVM没有启动吗? - oxbow_lakes
13个回答

376

如果您使用的是32位系统,则可以将其增加到2GB。 如果您使用的是64位系统,则可以更高。 如果您选择错误,也不必担心,如果在32位系统上请求5g,Java会抱怨一个无效值并退出。

正如其他人发布的那样,请使用cmd-line标志,例如

java -Xmx6g myprogram

你可以通过键入java -X来获取完整列表(或者几乎完整列表)。


20
根据我的经验,在32位虚拟机上(无论是在32位还是64位系统上——这里重要的是虚拟机),Java实际接受的堆大小大约为2G。此外,我感到惊讶的是询问者没有首先搜索并查找:https://dev59.com/1nI-5IYBdhLWcg3w9tdw和:https://dev59.com/zXVD5IYBdhLWcg3wQZQg - wsorenson
3
当然,你是正确的——在32位系统上,你只能寻址2GB的内存。 - Steve B.
1
不行。但人们通常这样做是因为JVM永远不会浪费时间调整大小。说实话,我觉得这并不重要。 - Steve B.
2
@PhilipRego 你可以将其设置为任何你想要的值,但不能超过JVM可以寻址的限制。-Xmx2G将内存设置为2G(还要看一下-Xms)。这并不意味着你需要多少内存。 - Steve B.
1
JAVA_OPTS 对我没用。JAVA_TOOL_OPTIONS 有效。 - enigmaticPhysicist
显示剩余8条评论

187

您可以使用以下命令行选项来增加JVM分配的堆大小:

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

以下是示例,最小堆大小设置为16mb,最大堆大小设置为64mb:

java -Xms16m -Xmx64m ClassName

31
在32位JVM上,理论上可以设置的最大堆大小为4GB。要使用更大的堆大小,您需要使用64位JVM。请尝试以下命令:

java -Xmx6144M -d64

-d64 标志很重要,因为它告诉JVM以64位模式运行。

谢谢老板,但在我的系统中它无法工作,还有其他我需要注意的东西。 - Sunil
6
定义"not working"。它是指无法启动并给出错误提示吗?还是启动了但使用了不同的堆大小? - Kevin

18

您可以通过传递JVM参数-Xms-Xmx来增加堆大小,例如:

对于Jar文件:


对于Jar文件:
java -jar -Xms4096M -Xmx6144M jarFilePath.jar

对于Java文件:

 java -Xms4096M -Xmx6144M ClassName

以上参数将初始堆大小(-Xms)增加到4GB(4096 MB),并将最大堆大小(-Xmx)增加到6GB(6144 MB)。

但是,年轻代(Young Generation)的堆大小将保持不变,并且额外的堆大小将添加到老年代(Old Generation)的堆大小中。为了使年轻代堆和老年代堆的大小相等,请使用-XX:NewRatio=1 -XX:-UseAdaptiveSizePolicy参数。

java -jar -Xms4096M -Xmx6144M -XX:NewRatio=1 -XX:-UseAdaptiveSizePolicy pathToJarFile.jar

-XX:NewRatio = Old Gen堆大小 : Young Gen堆大小(您可以根据需要调整此比率以获得所需的比率)。


13

在Eclipse中,可以直接增加JVM分配的堆大小。

进入Eclipse IDE后,依次点击:

运行---->运行配置---->参数

输入-Xmx1g(用于设置最大值,例如:Xmx256m或Xmx1g...... m代表MB,g代表GB)


3
只是补充一下,这应该是一个VM参数(eclipse给你两个选项)。 - Matt Boyle

11

java -d64 -Xms512m -Xmx4g HelloWorld

-d64: 启用64位JVM

-Xms512m: 将初始堆大小设置为512 MB

-Xmx4g: 将最大堆大小设置为4 GB

(这里的Java文件名是: HelloWorld.java)


8
请使用以下命令将堆大小更改为6GB。
export JAVA_OPTS="-Xms6144m -Xmx6144m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"

如果我的系统内存为8G,并且从任务管理器中可以看到始终有70%的内存在使用,那么是否可以将6G的内存分配给Java堆大小呢? - Reihan_amn
1
@Reihan_amn 是的和不是的,如果你超出了内存限制,它会进入分页文件,这在磁盘上非常缓慢。如果你超出了分页文件的限制,那么你就会遇到麻烦。 - CodeMonkey
如果使用此导出命令,则任何Java程序默认都会受到6Gb的限制,除非在Java调用时指定-Xm*值? - Jose Cabrera Zuniga

7
我可以增加堆内存到物理内存的75%(6GB堆内存)。
是的,您可以这样做。事实上,您甚至可以将其增加到超过物理内存的数量。
是否应该这样做取决于系统中运行了多少其他程序。特别是,如果当前正在运行的应用程序和服务的“工作集”显着超过可用的物理内存,则您的系统可能会“抖动”,花费大量时间在磁盘上移动虚拟内存页面。最终效果是系统变得非常慢。

谢谢您的评论,但我该如何增加呢?请问您能给出命令吗? - Sunil
尝试使用-Xmx6000m。如果您正在使用64位版本的Java,则应该可以工作。 - Stephen C
3
你确定你正在运行64位版本的Java?在64位操作系统上? - Stephen C

3
一些人指出了使用 -Xms-Xmx jvm 选项设置堆大小的具体答案。我想指出,这并不是 jvm 的唯一类型的内存选项。特别是,如果您遇到堆栈溢出,则需要添加另一个选项来增加堆栈大小,例如 -Xss8m

针对此问题,像 -Xms2g -Xmx6g -Xss8m 这样的 jvm 选项将是解决方案。

我分享这些信息,因为我的谷歌搜索如何增加 jvm 内存,最终找到了这个解决方案,但是这些解决方案在高内存分配下不起作用。一旦我知道了具体的设置是什么,我就能够通过谷歌搜索如何增加堆栈大小,并找到缺少的参数。:)希望这可以为其他人节省时间,因为它肯定会为我节省大量时间。:)


2

这仅适用于64位Java版本。进入控制面板并单击Java图标。在Java控制面板的小窗口中,单击Java菜单栏,然后单击查看按钮。

如果您有两个Java平台,请禁用以前的Java版本,然后单击运行时参数文本字段并写入-Xmx1024m或小于RAM大小。不要将堆大小增加到等于RAM,否则系统会崩溃。


如果你将堆大小设置为RAM大小,系统不会崩溃。相反,系统会开始分页并变得缓慢。 - DaveTheMinion

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