32位JVM:最大堆空间?

时间:2014-05-20 14:20:35

标签: java windows windows-7 jvm

我知道32位JVM的最大堆空间据说是2G,但我通过实验发现我只能分配大约1290M的变化空间,有时更多,有时更少。 (有时我可以安全地分配更多,有时即使在那个数字上我也会收到错误。)

我还有64位JRE,我的操作系统是Win7 64位,所以几乎不能限制RAM的使用。

我没有问题,因为我可以简单地使用64位JVM,但是你知道的事情越精确,你就越能帮助别人。

所以我想知道:为什么我会得到这个奇怪的最大堆区域?

我使用了像

这样的cmd命令
"%java32%" -xmx****M Program

xmx和java32的数字不同,作为指向32位JRE的变量。

我在其他地方寻找这个话题,但要么是其他地方,要么我不是很擅长搜索。

编辑:

分配是不准确的,因为我没有使用那个内存,我只是向系统询问了它。

64位JRE当然允许堆空间甚至高于4G。

1 个答案:

答案 0 :(得分:1)

您可以向Java Runtime询问最大值:

public class MaxMemory {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        long totalMem = rt.totalMemory();
        long maxMem = rt.maxMemory();
        long freeMem = rt.freeMemory();
        double megs = 1048576.0;

        System.out.println ("Total Memory: " + totalMem + " (" + (totalMem/megs) + " MiB)");
        System.out.println ("Max Memory:   " + maxMem + " (" + (maxMem/megs) + " MiB)");
        System.out.println ("Free Memory:  " + freeMem + " (" + (freeMem/megs) + " MiB)");
    }
}

来源:https://stackoverflow.com/a/7019624/12860

原因(来自Oracle常见问题解答):

32位JVM的最大理论堆限制为4G。由于各种附加约束,例如可用交换,内核地址空间使用,内存碎片和VM开销,实际上限制可以低得多。在大多数现代32位Windows系统上,最大堆大小范围为1.4G到1.6G。在32位Solaris内核上,地址空间限制为2G。在运行32位VM的64位操作系统上,最大堆大小可能更高,在许多Solaris系统上接近4G。