增加Java中的堆大小


276

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


2
你试过了-Xmx6g吗?这行不通吗?你观察到了什么?
oxbow_lakes

2
我想您尝试增加堆但失败了吗?您是否正在使用64位JVM?
巴特·基尔斯

感谢您的评论,但这不起作用
Sunil

好吧-您怎么知道它不起作用?JVM是否无法启动?
oxbow_lakes

Answers:


327

您可以在32位系统上增加到4GB。如果您使用的是64位系统,则可以更高。如果您选择不正确,无需担心,如果您在32位系统上要求5g,则Java会抱怨无效值并退出。

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

java -Xmx6g myprogram

您可以通过键入java -X来获得完整列表(或者无论如何都接近完整列表)。


16
根据我的经验,Java将使用32b VM(在32b或64b系统上-VM是此处的重要部分)可以接受的实际堆大小约为2G。此外,惊讶提问者没有第一搜索和查找:stackoverflow.com/questions/1596009/... :和 stackoverflow.com/questions/37335/...
wsorenson

2
嗯,您当然是对的-在32位系统上,您只能寻址2 Gb的内存。
史蒂夫·B

最大堆和最小堆大小是否必须相同?
user1747935

1
不会。但是人们通常这样做是因为JVM永远不会浪费时间调整大小。TBH怀疑这很重要。
史蒂夫·B。

1
@PhilipRego可以将其设置为所需的任何值,最高可以达到JVM可以解决的限制。-Xmx2G将您的内存设置为2G(另请参阅-Xms)。这根本没有说明您需要多少内存。
史蒂夫·B

155

使用命令行选项可以增加JVM分配的堆大小。这里有3个选项

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

java -Xms16m -Xmx64m ClassName

在上面的行中,我们可以将最小堆设置为16mb,最大堆设置为64mb


28

在32位JVM上,理论上可以设置的最大堆大小为4gb。要使用更大的堆大小,您需要使用64位JVM。尝试以下方法:

java -Xmx6144M -d64

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


谢谢老板,但是它在我的系统中不起作用,我还缺少其他东西
Sunil

4
定义“无效”。它不会启动并给您错误吗?它是否开始但使用了不同的堆大小?
凯文(Kevin)2009年

11

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

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

输入-Xmx1g(用于设置最大大小,例如Xmx256m或Xmx1g……m-> mb g ---> gb)


3
只需添加一个VM参数即可(eclipse为您提供了两个选择)。
马特·博伊尔

11

java -d64 -Xms512m -Xmx4g HelloWorld

其中,-d64:将启用64位JVM -Xms512m:将初始堆大小设置为512 MB -Xmx4g:将最大堆大小设置为4 GB(此处的Java文件名为:HelloWorld.java)


9

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

对于Jar文件:

java -jar -Xms4096M -Xmx6144M jarFilePath.jar

对于Java文件:

 java -Xms4096M -Xmx6144M ClassName

上面的参数将InitialHeapSize(-Xms)增加到4GB(4096 MB),并将MaxHeapSize(-Xmx)增加到6GB(6144 MB)。

但是,“ 年轻一代”堆大小将保持不变,并且其他堆大小”将添加到“ 老一代”堆大小中。要使Young Gen Heap和Old Gen Heap的大小相等,请使用-XX:NewRatio = 1 -XX:-UseAdaptiveSizePolicy参数。

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

-XX:NewRatio =老一代堆大小:年轻一代堆大小(您可以使用此比率进行游戏以获得所需比率)。


7

我可以将堆内存增加到物理内存(6GB堆)的75%。

是的你可以。实际上,如果需要,可以增加到比物理内存更多的数量。

这样做是否一个好主意,取决于系统上正在运行的其他数量。特别是,如果当前正在运行的应用程序和服务的“工作集”大大超过了可用的物理内存,则您的系统很容易“崩溃”,从而花费大量时间在磁盘之间来回移动虚拟内存页面。最终结果是系统变得非常慢。


感谢您的评论,但是我怎么增加。请给我命令。
Sunil

尝试-Xmx6000m。如果您使用的是64位版本的Java,它应该可以工作。
Stephen C

3
您确定您正在运行Java的64位版本吗?在64位操作系统上?
Stephen C

4

请使用以下命令将堆大小更改为6GB

export JAVA_OPTS="-Xms6144m -Xmx6144m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"

如果我的系统中有8G内存,并且从任务管理器中可以看到始终有70%的内存正在使用;这有可能为Java堆大小分配6G内存吗?
Reihan_amn

1
@Reihan_amn是和否,如果超出内存,它将转到分页,该分页位于磁盘上,并且运行速度非常慢。如果超出页面文件,那么您将陷入困境。
CodeMonkey

2

一些人指出,为堆大小与JVM选项的具体答案-Xms-Xms。我想指出的是,这不是jvm的唯一内存选项类型。具体来说,如果您获得堆栈溢出的流量,则需要通过添加其他选项来增加堆栈的大小,例如-Xss8m

对于这个问题,jvm选项类似 -Xms2g -Xmx6g -Xss8m将是一个解决方案。

我正在分享有关此信息的信息,因为我的Google搜索如何增加jvm内存将我带到了该解决方案,并且该解决方案不适用于大量的内存分配。一旦弄清楚了具体的设置是什么,就可以用谷歌搜索如何增加堆栈大小并找到缺少的参数。:)希望这可以节省其他人的时间,因为这可以节省我很多时间。:)


2

这仅适用于Java的64位版本。转到控制面板,然后单击Java图标。在Java控制面板的小窗口上,单击Java菜单栏,然后​​单击view按钮。

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


如果使堆大小等于RAM,则系统不会崩溃。取而代之的是,系统将开始分页,并且运行缓慢。
DaveTheMinion

0

是。您可以。

您可以将堆内存增加到物理内存(6 GB堆)的75%或更高。

由于您使用的是64位,因此可以将堆大小增加到所需的数量。如果您使用的是32位,则限制为4GB。

$ java -Xms512m -Xmx6144m JavaApplication

设置初始堆大小为512mb,最大堆大小为6GB。

希望能帮助到你.. :)


这似乎与几年前发布的两个最受好评的答案非常相似。
Bernhard Barker

0

我在使用eclipse / STS在Java代码中运行py文件时遇到问题,由于jvm堆内存不足而导致PyException。我已经进行了如下所述的更改,并且能够解决此问题。以下是我的系统配置。

在此处输入图片说明

这些就是我在工作区中所做的更改,现在它可以完美运行。

在此处输入图片说明 在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.