2011-07-10 81 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

相關問題