“ VM初始化期间发生错误;-Xmx3G无法为对象堆保留足够的空间”


89

首先,我有一个装有8gb ram的盒子,所以我怀疑总内存是问题所在。此应用程序在6gb或更少的计算机上运行良好。

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

每次我尝试保留1500mb以上时,都会出现以下错误:“ VM初始化期间发生错误;-Xmx3G无法为对象堆保留足够的空间”

这里发生了什么?


2
您有什么版本的Java?您正在运行什么操作系统?
亚当·罗弗

这是Win7,我安装了3个不同的Java版本。其中之一就是Eclipse使用的32位JRE。
user1212731 '02

3
不要忘记将答案标记为正确。
xdhmoore

只需使用您可利用的空间更改gridle.property中的设置
Bhushan

Answers:


64

可能是您在该计算机上使用的是32位jvm吗?


8
很抱歉这个愚蠢的问题,但是我将如何检查呢?以及如何使用64位?
user1212731 2012年

3
实际上,我只是在命令行中尝试了java -d64 -version,它提供了64位服务器VM。
user1212731 2012年

6
显然,Eclipse使用的是我先前安装的32位版本的JRE,即使64位版本是最新安装。我更改了首选项->已安装的JRE中的设置来解决此问题。非常感谢您的回答!
user1212731

3
在任何情况下,32位是否足以满足4GB的要求?
托马斯

7
应该的,但是这解决了我的问题。由于缺乏解释,因此没有投票支持该答案。该链接说明了32位jvm如何不能超过1gb的最大堆空间
Steven

57

解决方法如下: 转到 Start->Control Panel->System->Advanced(tab)->Environment Variables->System

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

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

将此更改为适当的路径


4
只是给别人的笔记。您添加一个SYSTEM变量,而不是USER变量。我在Eclipse中遇到了这个问题,在进行了上述更改之后不必重启我的机器……我只需要重启Eclipse。谢谢!
captain_jim1

对于好奇的人,_JAVA_OPTIONS中的-Xmx标志指定了允许的最大JVM堆大小。这可以防止JVM请求不合理的空间(尤其是对于32位计算机来说连续
不可

40

实际上,这不是特定于Eclipse的问题。这是Windows上的一般Java问题。这是因为JVM在Windows上如何分配内存。它坚持要分配一个连续的内存块,即使有足够多的单独块来满足分配请求,Windows经常不能提供这些内存。有一些实用程序将尝试帮助Windows“整理”其内存,从理论上讲,这将有助于解决这种情况。但是我还没有真正认真地尝试过它们,所以不能说出它们的有效性。有时我听到的一件事可能会有所帮助,那就是重新启动Windows,然后在启动任何其他应用程序之前启动需要大量内存的Java应用程序。如果幸运的话,Windows尚不会碎片化其内存空间,而Java将获得所需的连续块。

在互连网上的某个地方,有更多关于此问题的技术说明和分析,但我没有任何方便的参考资料。

我确实发现了这一点,它看起来很有帮助:https : //stackoverflow.com/a/497757/639520


2
就我而言,您的答案似乎可行。我没有重新启动Windows,但尝试关闭Windows中的其他应用程序,然后运行Java,它能够启动VM。
sttaq

21

首先,32位的JRE不能使用更多的〜1.5Gb内存。因此,如果您需要更多,请使用64位JRE。

其次,当新的JVM启动时,这将对正在运行的所有JVM的-Xmx属性求和,并检查系统上是否有足够的内存以其自己的-Xmx运行,如果不够,则会发生错误。


15

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



9

确保Eclipse实际上正在运行您认为正在运行的同一JVM。如果您曾经在网络浏览器中使用过Java,则可能还会有一个32位版本的浮动版本,如果最近安装或更新了它,则该版本可能会优先。

绝对可以肯定,我建议将这两行添加到eclipse.ini文件的顶部:

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

...我的机器C:/Java/jdk1.6.0_27/bin上我知道64位JVM的位置。确保有bin文件夹中。

(作为奖励,在Windows 7上,这还允许您实际“固定选项卡”,这就是我必须自己使用的原因)


-vm参数应该指向Java可执行文件,而不仅仅是文件夹。参见wiki.eclipse.org/%C2%A0eclipse.ini#Specifying_the_JVM
E-Riz

1
错误。看到以下Eclipse错误:bugs.eclipse.org/bugs/show_bug.cgi?id=314805
Adam Rofer

这确实是问题!Eclipse使用的是我在某个时候安装的32位版本的JRE。非常感谢您的回答,并引导我朝正确的方向前进!我非常感谢。
user1212731'2

@AdamRofer,该错误很有趣,但特别是有关Windows 7的错误,可解决将Eclipse固定到任务栏的问题。通常,eclipse.ini应该指向Java可执行文件,尽管Equinox启动器似乎很聪明,因为-vm指向文件夹时(至少在Windows上),它将查找Java可执行文件。
E-Riz

@ E-Riz“应该”对我的口味来说太严格了:)希望他们能够解决该错误,而不必在某个时候更改vm参数。下面是将有利于他们更新的详细信息eclipse.ini页:wiki.eclipse.org/...
亚当优越位置让

5

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


2

使用32位Eclipse和64位JVM时,我也遇到相同的问题。当我将Eclipse路由到32位JVM时,它起作用了


2

只需将#符号org.gradle.jvmargs=-Xmx1536m放在gradle.properties 中的前面

 # org.gradle.jvmargs=-Xmx1536m

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

0

无论如何,您可能正在尝试错误的选择。我在支持错误日志中遇到了类似的错误:

Java HotSpot(TM) Client VM warning: ignoring option PermSize=32M; support was removed in 8.0
Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0

就我而言,该软件尚不支持Java 8(脚本使用的是旧的JVM参数),但是默认情况下我具有Java 8。


0

此问题的原因之一是没有可用的内存来启动Tomcat。尝试从Windows删除不需要的正在运行的软件,然后重新启动Eclipse和Tomcat。


0

我知道我来晚了,但是我的回答是:

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

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

希望我能帮助:)

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.