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

时间:2010-03-16 19:40:09

标签: java jvm heap

我{34} 32位Windows上的最大堆大小约为1.5GB,这是因为JVM需要连续的内存。有人可以解释“连续内存”的概念,以及为什么你在Windows上只有最大1.5GB?

其次,64位Windows上的最大堆大小是什么,为什么这与32位上的可用内容不同?

3 个答案:

答案 0 :(得分:36)

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前缀!

答案 1 :(得分:6)

连续只是意味着“无间隙”,一个长单段。该数量受操作系统可为您的流程映射的段大小的限制。 Java是否需要连续堆是JVM特有的实现问题,而其他VM可能不存在。

答案 2 :(得分:4)

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

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