我知道32位JVM的最大堆空间据说是2G,但我通过实验发现我只能分配大约1290M的变化空间,有时更多,有时更少。 (有时我可以安全地分配更多,有时即使在那个数字上我也会收到错误。)
我还有64位JRE,我的操作系统是Win7 64位,所以几乎不能限制RAM的使用。
我没有问题,因为我可以简单地使用64位JVM,但是你知道的事情越精确,你就越能帮助别人。
所以我想知道:为什么我会得到这个奇怪的最大堆区域?
我使用了像
这样的cmd命令"%java32%" -xmx****M Program
xmx和java32的数字不同,作为指向32位JRE的变量。
我在其他地方寻找这个话题,但要么是其他地方,要么我不是很擅长搜索。
编辑:
分配是不准确的,因为我没有使用那个内存,我只是向系统询问了它。
64位JRE当然允许堆空间甚至高于4G。
答案 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。