我已经阅读了在32位Windows上的最大堆大小约为1.5GB,这是因为JVM需要连续的内存。请问有人能解释一下“连续内存”的概念以及为什么在Windows系统上只有最大1.5GB的限制吗?
其次,在64位Windows系统上的最大堆大小是多少,为什么与32位系统可用的不同?
我已经阅读了在32位Windows上的最大堆大小约为1.5GB,这是因为JVM需要连续的内存。请问有人能解释一下“连续内存”的概念以及为什么在Windows系统上只有最大1.5GB的限制吗?
其次,在64位Windows系统上的最大堆大小是多少,为什么与32位系统可用的不同?
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前缀!
Contiguous的意思是“没有间隙”,一个长的单一段。它的大小受限于操作系统为您的进程映射的最大段大小。Java是否需要连续的堆取决于JVM的具体实现问题,可能对其他虚拟机不存在。