了解最大JVM堆大小 - 32位和64位

问题描述:

我已经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

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

连续简单的意思是“没有空白”,一个长单段。数量受操作系统可为您的流程映射多大的程度的限制。无论Java是否需要连续的堆,都是JVM特有的实现问题,而其他VM可能不存在。

连续内存不是限制Windows仅使用1.2 GB堆的问题。即使定义了最小/最大堆,JVM在启动时也会占用系统内存中的最大堆。然后它将只占用占用系统内存中的最小堆,直到它不得不扩展。在大多数实现中启动JVM以提高性能需要最大堆的连续内存。

正如Marcus在上面解释的,对于单个进程(线程),32位硬件的限制是4GB。每个操作系统都以4GB的差异来解决这个问题。 4GB主要被拆分为内核空间和用户空间。在32位窗口中,最大用户空间接近1.5 GB。可以选择使用/ 3GB开关启动Windows以获得更多用户空间。