使用-Xmx 1g不会增加Java堆空间

时间:2014-08-30 21:59:57

标签: java heap heap-memory

我正在做一些奇特的东西,我真的需要分配大约1 GB。

我的电脑有8GB 64位系统,所以这不是问题。

我使用-Xmx 4g来增加我的堆空间,但遗憾的是,它根本不起作用。

我用:

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)");

这告诉我:

Total Memory: 259522560 (247.5 MiB
Max Memory:   259522560 (247.5 MiB)
Free Memory:  0 (0 MiB)

我真的不知道自己做错了什么。你们中有谁有想法吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

它是-Xmx4g,中间没有空格。

答案 1 :(得分:2)

告诉我们您的整个命令行,我怀疑您使用:

java -jar file.jar -Xmx 4G

java -cp file.jar package.Main -Xmx 4G

两者都错了,您可以使用以下其中一种:

java -Xmx4G -jar file.jar
java -Xmx4G -cp file.jar package.Main

答案 2 :(得分:1)

-Xmx4g(没有空格,正如已经指出的那样)只会设置堆大小的最大值,而不会在启动时自动分配全部金额。

-Xms4g可能会这样做,因为这会设置初始堆大小。

通常人们会在app启动时将它们设置为一对。例如,当使用生成大量运行时生成的类的类启动服务器时......

-Xms256m -Xmx2048m -XX:MaxPermSize = 256m

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

答案 3 :(得分:1)

-xmx选项设置堆的最大大小。但是JVM通常以较小的堆开始,并根据需要进行扩展。

要告诉JVM堆的初始大小,也可以使用-xsx选项; e.g。

   java -xmx4g -xsx4g ...

告诉Java我们4g堆,并从一开始就设置该大小。请注意,这并不一定会导致所有物理/虚拟内存立即分配给进程。但是,堆的空间大小应该与标称初始大小成比例设置。

(正如其他人所说,这些是原子选择;即不要在4g之前放置空格。)


如果知道您需要很大一部分请求的堆"很快就会#34;,那么设置-msx可以避免(重复)调整堆的大小启动。但是,如果您的-msx值远远高于您可能需要的值,那么您最终可能会不必要地使用系统资源。