理解最大JVM堆大小-32位与64位

33

我已经阅读了在32位Windows上的最大堆大小约为1.5GB,这是因为JVM需要连续的内存。请问有人能解释一下“连续内存”的概念以及为什么在Windows系统上只有最大1.5GB的限制吗?

其次,在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
我本以为在64位Win7上运行32位JVM也能获得4GB的内存,但实际并非如此,还是只有1.5GB...(JDK5) - zb226
3个回答

37

32位/64位部分与Java无关。

在32位系统中,内存位置由32位无符号整数引用。这允许最多2^32个可能的内存位置。由于每个位置存储1字节,因此您可以得到2^32字节或4GB(如果您喜欢)。

在64位系统上,有2^64个位置,即16 exabytes。

现在,在Windows中,连续的部分成为一个大问题,但这只是Windows做事情的方式。想法是您需要为堆具有整个“不间断”的范围。不幸的是,Windows在中间某个地方分配了一些内存。这基本上给您留下了左侧或右侧约1.5-2GB块的一半来分配您的堆。

有关32位与64位的详细信息,请查看此问题

编辑:感谢mrjoltcola提供exa前缀!


exa在peta之后;虽然这已经有点暗示了,但我认为值得指出的是,由于地址空间非常大,因此更容易找到一个更大的连续可用地址空间块——这就是为什么您可以在64位操作系统上指定更大的堆大小。 - rob
值得注意的是,对于内存而言,1艾字节等于1024^6字节,而1艾字节的存储容量则为1000^6字节。因此,2的64次方等于16艾字节的内存和18.4艾字节的存储容量。 ;) - Peter Lawrey

6

Contiguous的意思是“没有间隙”,一个长的单一段。它的大小受限于操作系统为您的进程映射的最大段大小。Java是否需要连续的堆取决于JVM的具体实现问题,可能对其他虚拟机不存在。


4
连续内存不是限制Windows只能使用1.2GB堆的问题。尽管定义了最小/最大堆,但JVM在启动时会从系统内存中占用最大堆。然后它只会在占用的系统内存中引用最小堆,直到必须扩展为止。在大多数实现中,需要最大堆的连续内存来启动JVM以提高性能。
正如Marcus上面所解释的,32位硬件的限制是单个进程(线程)的4GB。每个操作系统都以不同的方式处理这4GB。在32位Windows中,最大用户空间接近1.5 GB。有选项可以使用/3GB开关引导Windows以获得更多用户空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接