无法为对象堆保留足够的空间以启动JVM。

21

刚遇到了一个奇怪的问题。当我输入

java -version

我得到了

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

.

java -Xms64m -Xmx64m -version

这个命令运行得很好

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode)
如果我将xms和xmx更改为128m,我会再次收到错误。
使用top命令和free -m命令,我可以看到我有超过192 MB的可用空间,那么为什么还是会出现这个错误?
Mem:    262144k total,    64760k used,   197384k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

谢谢


今天我突然遇到了一个问题 - 原来是我切换到了OpenJDK JRE 7。通常我使用的是Oracle JDK 8,它不会出现这个问题 - 至少在VM数量较少的情况下不会。 - Stefan Reich
3个回答

14

当我在64位环境下使用32位Java版本时,遇到了同样的问题。在64位操作系统中使用64位Java时则没有问题。


我有同样的问题。在64位系统上使用32位Java。从Xmx1024开始会导致上述错误。从Xmx512开始就可以正常工作! - T3rm1
我曾经遇到过同样的问题。我在64位电脑上使用32位JRE。我将JRE更改为64位系统,问题得到了解决。 - Devrim

11

看起来你尝试运行这个程序的机器只有256MB内存。

可能JVM尝试分配一个64MB的大的连续内存块。你剩余的192MB可能已经被分成了更小的块,所以没有一个64MB连续的空闲块可以被分配。

尝试用更小的堆大小启动你的Java程序,例如:

java -Xms16m ...

是的,我的机器只有256MB内存,在使用-Xms16m和-Xms64m参数时可以正常工作。但是64MB对我的需求来说不够。有没有什么办法可以解决这个问题,让我能够使用128MB? - user12384512
请注意,-Xms 设置初始堆大小(-Xmx 设置最大堆大小)。你的程序真的需要一个 64 MB 的初始堆大小吗?为什么不让 JVM 自动增长呢? - Jesper
是的,我知道。但这并不重要。因为即使使用java -Xms16m -Xmx128m -version也失败了。 - user12384512
1
如果计算机只有256 MB的RAM,那么为Java堆分配128 MB的内存将会很困难。操作系统等也需要占用内存。 - Jesper

5
根据这篇文章,该错误信息的意思是:

堆大小超过了计算机物理内存。

编辑:堆不是唯一预留的内存,我想至少还有其他JVM设置(如PermGenSpace)需要内存。当堆大小为128M,PermGenSpace为64M时,您已经填满了可用空间。

为什么不缩小其他内存设置以释放堆空间?


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