VM初始化时发生错误; 无法保留足够的空间来存储对象堆。使用-Xmx3G。

104

首先,我有一台8GB的内存电脑,因此我怀疑总内存不是问题所在。 该应用在6GB或更小内存的机器上运行良好。

我正在尝试在Eclipse的“运行配置”下使用“VM参数”来保留3GB的空间,命令为-Xmx3G。

每次我尝试保留超过1500MB的空间时,我都会收到以下错误提示:“初始化VM时发生错误;无法为对象堆保留足够的空间”。

这是怎么回事?


2
你使用的Java版本是什么?你正在运行哪个操作系统? - Adam Rofer
这是Win7系统,我安装了3个不同版本的Java。其中一个是32位JRE,Eclipse正在使用它。 - user1212731
3
别忘了将一个答案标记为正确的答案。 - xdhmoore
只需在 gridle.property 中更改设置,使用适当的空间即可。 - Bhushan
16个回答

71

你的机器上使用的是32位的java虚拟机吗?


8
抱歉这个问题可能有些愚蠢,但我应该如何进行检查?另外,我该如何使用64位? - user1212731
3
实际上,我刚刚在命令行中尝试了"java -d64 -version",结果显示为64位服务器VM。 - user1212731
6
显然,Eclipse使用了我之前安装的32位JRE版本,尽管64位是最新的安装版本。我在“首选项”中更改了“已安装的JRE”设置以解决此问题。非常感谢您的回答! - user1212731
3
无论如何,32位寻址不应该足以寻址4GB吗? - Thomas
7
这个回答应该可以解决我的问题,但因为缺乏解释所以没有点赞。这个链接解释了32位jvm无法超过1GB的最大堆空间限制。 - Steven
显示剩余3条评论

64

以下是修复方法: 进入 开始->控制面板->系统->高级(tab)->环境变量->系统

进入 开始->控制面板->系统->高级(tab)->环境变量->系统

Variables->New:
Variable name: _JAVA_OPTIONS   
Variable value: -Xmx512M

Variable name: Path  
Variable value: ;C:\Program Files\Java\jre6\bin;F:\JDK\bin;  

将此更改为您的适当路径


5
给其他人提个醒。你需要添加一个系统变量,而不是用户变量。我在Eclipse中遇到了这个问题,在进行以上更改后,我不必重新启动计算机,只需要重新启动Eclipse即可。谢谢! - captain_jim1
1
对于那些好奇的人,_JAVA_OPTIONS 中的 -Xmx 标志指定了允许的 JVM 堆大小的最大值。这可以防止 JVM 请求不合理的空间(特别是对于32位机器而言,它们无法连续分配内存...)。 - varun

42

这实际上不是Eclipse特有的问题,而是一个普遍的Java-on-Windows问题。这是因为JVM在Windows上分配内存的方式;它坚持要分配一个连续的内存块,而通常Windows无法提供,即使有足够的单独的内存块来满足分配请求。

有一些实用程序将尝试帮助Windows“碎片整理”其内存,理论上有助于解决这个问题;但我并没有认真尝试过它们,不能说明它们的有效性。

有时听到的一个可能有帮助的方法是在启动任何其他应用程序之前重新启动Windows并启动需要较大内存块的Java应用程序。如果你幸运的话,Windows还没有碎片化其内存空间,Java将获得它所请求的连续块。

在互联网上有更多技术解释和分析这个问题的文献,但我手头没有任何参考资料。

我确实找到了这个看起来很有帮助的链接:https://dev59.com/M3VC5IYBdhLWcg3w1E1q#497757


2
在我的情况下,你的答案似乎可行。我没有重新启动Windows,但我尝试关闭我的Windows中的其他应用程序,然后运行Java,它能够启动虚拟机。 - Syed Ali

22

首先,32位的JRE不能使用超过1.5GB的RAM。因此,如果您需要更多RAM,请使用64位的JRE。

其次,当新的JVM启动时,它会将所有正在运行的JVM的-Xmx属性相加,并检查系统上是否有足够的内存来运行它们各自的-Xmx。如果没有足够的内存,则会出现错误。


17

我使用eclipse IDE中的Tomcat服务器与Liferay一起使用。当单击启动服务器时,我遇到了同样的错误。 从eclipse中双击服务器打开Server Overview页面。将内存参数从-Xmx1024m -XX:MaxPermSize = 256m更新为-Xmx512m -XX:MaxPermSize = 256m。 然后就可以正常工作了。


http://www.genericarticles.com/mediawiki/index.php?title=How_to_increase_tomcat_memory_inside_eclipse - bulltorious

9

确保Eclipse实际运行的是你认为它运行的同一个JVM。如果你曾经在浏览器中使用过Java,那么可能还有一个32位版本在那里,如果最近安装或更新了,可能会优先使用。

为了绝对确定,我建议在你的eclipse.ini文件顶部添加以下两行:

-vm 
C:/Java/jdk1.6.0_27/bin

我需要确定 64 位 JVM 所在位置,它在我的机器上的路径为 C:/Java/jdk1.6.0_27/bin。请确保将该路径下的 bin 文件夹添加进去。

(作为额外奖励,在 Windows 7 上,这还允许您实际上“固定标签页”,这也是我必须为自己的使用而这样做的原因)


-vm参数应该指向Java可执行文件,而不仅仅是一个文件夹。请参阅http://wiki.eclipse.org/%C2%A0eclipse.ini#Specifying_the_JVM - E-Riz
1
错误。请参考此Eclipse bug:https://bugs.eclipse.org/bugs/show_bug.cgi?id=314805 - Adam Rofer
这确实是问题所在!Eclipse使用了我曾经安装的32位JRE版本。非常感谢您的答案和指引,让我找到了正确的方向!我非常感激。 - user1212731
@AdamRofer,那个bug很有趣,但是特别针对Windows 7,并且是为了解决将Eclipse固定到任务栏时出现的问题。一般来说,eclipse.ini应该指向java可执行文件,尽管Equinox启动器似乎很智能,如果-vm指向一个文件夹(至少在Windows上),它会寻找一个java可执行文件。 - E-Riz
@E-Riz,“应该”对我来说太严格了 :) 希望他们能在不必更改vm参数的情况下解决这个错误。以下是更多信息,他们应该在他们的'eclipse.ini'页面上更新:http://wiki.eclipse.org/Equinox_Launcher#Finding_a_VM.2C_Using_JNI_Invocation_or_Executing_Java - Adam Rofer

5
这是堆大小的问题。编辑你的.bat(批处理文件)。它可能显示堆大小为1024。将其更改为512,然后它应该可以工作。

5

只需在 gradle.properties 文件中 org.gradle.jvmargs=-Xmx1536m 前面添加 # 即可。

 # org.gradle.jvmargs=-Xmx1536m

不确定在 Mac OS 上尝试 Kotlin-multiplatform 是如何工作的!无论如何,谢谢! - Chintan Soni

2
我在使用32位的Eclipse时遇到了同样的问题,它所使用的JVM是64位的。当我将Eclipse切换成32位JVM时,它就正常工作了。

1

我知道我有点晚了,但是我的答案来了:

我刚刚安装了Oracle的Java在线版本(不是离线64位版本)。

添加了JAVA_HOME环境变量后,它就可以工作了!

希望能帮到你 :)


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