使用-xmx1g不会增加Java堆空间

使用-xmx1g不会增加Java堆空间,java,heap,heap-memory,Java,Heap,Heap Memory,我正在做一些奇特的事情,我真的需要分配大约1GB 我的电脑有8GB 64位系统,所以这不是问题 我使用-xmx4g来增加堆空间,但遗憾的是这根本不起作用 我使用: Runtime rt = Runtime.getRuntime(); long totalMem = rt.totalMemory(); long maxMem = rt.maxMemory(); long freeMem = rt.freeMemory(); double megs = 1048576.0; System.out.

我正在做一些奇特的事情,我真的需要分配大约1GB

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

我使用
-xmx4g
来增加堆空间,但遗憾的是这根本不起作用

我使用:

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)
我真的不知道我做错了什么。你们有谁有主意吗


非常感谢

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

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

-Xms4g很可能做到这一点,因为它设置了初始堆大小

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

-Xms256m-Xmx2048m-XX:MaxPermSize=256m


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

java -jar file.jar -Xmx 4G

两者都是错误的,您可以使用以下选项之一:

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

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

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

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

(正如其他人所指出的,这些是原子选项;即不要在
4g
前面加空格)



如果您知道“很快”将需要请求的堆的很大一部分,那么设置
-msx
可以避免在启动期间(重复)调整堆的大小。但是,如果您的
-msx
值远远超过您可能需要的值,那么您可能最终会不必要地使用系统资源。

-Xmx4g它没有什么区别,仍然没有work@Daniel如果它没有帮助,那么你可能是以错误的方式传递了论点?你能告诉我们你使用的整个命令行吗?必须在类名之前设置参数。如果你把它放在后面,它会解释为什么它没有在你的超级空白中失败。maxMemory()应该显示-Xmx设置,即使在没有提交或使用内存的情况下也是如此。所以我想Xms不是这里的问题,但是指出这一点很好。
   java -xmx4g -xsx4g ...