2010-03-16 95 views
33

我已經read 32位Windows上的最大堆大小爲〜1.5GB,這是由於JVM需要連續內存。有人可以解釋「連續內存」的概念,以及爲什麼在Windows上只有最大1.5GB?瞭解最大JVM堆大小 - 32位和64位

其次,64位Windows上的最大堆大小是什麼,爲什麼它與32位上的最大堆大小不同?

+2

在32位操作系統上的任何32位jvm的限制範圍從大約1.2 GB(某些版本的Windows)到2.0 GB(Solaris)。 64位Solaris上的32位jvm可以獲得4 GB的空間。我認爲64位Windows上的最大64位jvm是32GB。 – Seth 2010-03-16 20:03:10

+0

我本來預計64位Win7上的32位JVM也能夠獲得4GB - 但事實並非如此 - 它再次是1.5GB ......(JDK5) – zb226 2013-07-16 15:13:05

回答

35

32位/ 64位的部分是不相關的到Java

事實證明,在一個32位的系統存儲器位置由32位無符號整數引用。這允許最多2^32個可能的存儲位置。由於每個位置存儲1個字節,因此如果您願意,可以獲得2^32個字節或4個GB。

在64位系統上有2^64個位置,或16艾字節。

現在,在Windows中,連續部分成爲一個大問題,但這正是Windows如何做的事情。這個想法是你需要爲你的堆提供一個完整的「不間斷」範圍。不幸的是,Windows在中間某處分配了一些內存。這基本上會讓你左半邊或右半邊大約1.5-2GB塊分配你的堆。

查看this question瞭解有關32位和64位的更多詳細信息。

編輯:感謝mrjoltcola爲exa前綴!

+0

exa在peta之後出現;)我有些暗示但我認爲值得指出的是,由於地址空間非常大,因此更容易找到更大的連續可用地址空間塊 - 這就是爲什麼您可以在64位操作系統上指定更大的堆大小的原因。 – rob 2010-03-16 20:56:39

+0

其值得注意的是,對於內存,Exabyte是1024^6字節,Exabyte的存儲量是1000^6字節。所以2^64是16Eb內存和18.4Eb存儲。 ;) – 2010-03-17 21:01:23

6

連續簡單的意思是「沒有空白」,一個長單段。數量受操作系統可爲您的流程映射多大的程度的限制。無論Java是否需要連續的堆,都是JVM特有的實現問題,而其他VM可能不存在。

4

連續內存不是限制Windows僅使用1.2 GB堆的問題。即使定義了最小/最大堆,JVM在啓動時也會佔用系統內存中的最大堆。然後它將只佔用佔用系統內存中的最小堆,直到它不得不擴展。在大多數實現中啓動JVM以提高性能需要最大堆的連續內存。

正如Marcus在上面解釋的,對於單個進程(線程),32位硬件的限制是4GB。每個操作系統都以4GB的差異來解決這個問題。 4GB主要被拆分爲內核空間和用戶空間。在32位窗口中,最大用戶空間接近1.5 GB。可以選擇使用/ 3GB開關啓動Windows以獲得更多用戶空間。