2011-07-10 41 views
21

刚刚面临奇怪的问题。当我输入无法为对象堆预留足够的空间来启动JVM

java -version 

我得到

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

。如果我改变XMS,XMX至1.28

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) 

,我再次得到错误。

使用top命令和free -m我可以看到,我得到192 MB免费,所以为什么我仍然得到这个错误?

Mem: 262144k total, 64760k used, 197384k free,  0k buffers 
Swap:  0k total,  0k used,  0k free,  0k cached 

谢谢

+0

我今天突然发现了这个问题 - 事实证明我已经切换到了OpenJDK JRE 7.通常我使用Oracle JDK 8,它没有显示这个问题 - 至少没有少量的虚拟机。 –

回答

11

它看起来像你想上运行这个机器只有256 MB内存。

也许JVM试图分配一个大的,连续的64 MB内存块。您有空的192 MB可能会被分割成更小的部分,因此没有连续的64 MB空闲块可供分配。

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

java -Xms16m ... 
+0

是的,我的机器只有256 MB,-Xms16m和-Xms64m工作正常。但64是不足以满足我的需求。它可以以某种方式修复,所以我可以使用128 MB? – user12384512

+0

请注意'-Xms'设置初始堆大小('-Xmx'设置最大堆大小)。您的程序是否真的需要64 MB的**初始**堆大小?为什么不让JVM自动增长它? – Jesper

+0

是的,我知道。但这并不重要。由于java -Xms16m -Xmx128m -version也失败 – user12384512

5

根据this post此错误消息意味着:

堆大小比您的计算机的物理内存越大。

编辑:堆是不是被保留的唯一记忆,我想。至少还有其他的JVM设置,如PermGenSpace要求内存。随着128M的堆大小和64M的PermGenSpace,你已经填满了可用的空间。

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

12

在64位环境中使用32位版本的Java时,我遇到了同样的问题。在64位操作系统中使用64位Java时,它是可以的。

+0

我有同样的问题。在64位系统上使用32位Java。从Xmx1024开始导致上述错误。从Xmx512开始工作正常! – T3rm1

+0

我有同样的问题。我在64位PC上使用32位JRE。我将JRE更改为64位系统,并解决了我的问题。 – Devrim

相关问题