2012-10-05 27 views
-2

對不起提問,應該多查了一下。32位機器上不能給JVM 3072m堆空間

我用一個相當大的數據集和一個內存敏感算法運行weka。我需要所有堆空間,我不能得到!

這工作:

java -jar -Xmx2048m weka.jar & 

但這並不

java -jar -Xmx4096m weka.jar & 

我得到:

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

通過一些簡單的搜索,我發現,這是上限

java -jar -Xmx2594m weka.jar & 

我有4GB的內存,但一臺32位的機器。爲什麼我不能使用2^32字節= 4096MB的內存?

對於未來,我想知道我是否可以用例如數百GB的堆空間,如果我有正確的硬件和操作系統?

我已經安裝了1.6和1.7 JVM:

$java -showversion 
java version "1.6.0_24" 
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1) 
OpenJDK Server VM (build 20.0-b12, mixed mode) 
+1

http://stackoverflow.com/questions/1434779/maximum-java-heap-size-of-a-32-bit-jvm-on-a- 64位操作系統 –

回答

2

我有4GB的內存,但一個32位的機器。爲什麼我不能使用2^32字節= 4096MB的內存? 對於未來我想知道我是否可以用例如數百GB的堆空間,如果我有正確的硬件和操作系統?

爲4 GB,我建議您使用64位操作系統,並可能在64位JVM的堆積大小的限制可能爲1.2 GB(在Windows XP)

小如果您想要更大的JVM我建議確保你有64位的操作系統和JVM,並且你的內存比JVM的大小還要多。例如如果你想要一個40 GB的堆,你需要48 GB或64 GB的內存。

+0

任何信息爲什麼堆大小小於2 << 32 B?例如。 1.2 GB? – user1443778

+3

堆必須是連續的內存區域。在32位Windows中,它使用2 GB的操作系統和大量內存區域來共享分割內存的資源。對於不同版本的32位窗口,這意味着限制在1.2 GB和1.6 GB之間。BTW Windows XP甚至不能使用全部4 GB,它在這樣的系統上報告3.5 GB。 –

2

使用了Java的64位版本,它允許您使用更多的內存。這是32位Java虛擬機的限制。

+1

我不認爲可以在32位系統上運行64位版本的Java ... OP也需要安裝64位操作系統。 – hage

+0

好吧,爲什麼2 << 32 B!= 2594MB的限制? – user1443778

2

如果你有4GB的RAM,你如何期望所有的JVM都可用? JVM運行的操作系統怎麼樣,這也需要內存。它的工作方式是,儘管一般可以處理所有4GB的操作系統,但會限制每個進程的可用數量。

+0

通過交換JVM內存 – user1443778

+1

@ user1443778 JVM + swap = _really_壞主意,因爲JVM管理堆中的對象,並在GC期間移動它們。所以JVM經常遍歷所有的內存頁面,如果它們中的一些被交換,它是一個真正的性能殺手。 –

+0

@FrankPavageau我希望能夠快速修復(比安裝新的操作系統等更快),所以在夜間運行它可以。但是,如果JVM必須這樣做,那麼我明白爲什麼這是一個壞主意。 – user1443778

0

因爲無法分配4096m。它試圖獲得一塊4096米的單塊。在任何時間點哪個是不可能的。因此,您可以使用 3000-4000之間的較小值。或確保你的RAM沒有被任何進程使用