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

3

我正在进行一些花哨的操作,需要分配大约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个回答

4

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


-Xmx4g没有任何区别,它仍然无法工作。 - Daniel
@Daniel 如果这不起作用,那么你可能是以错误的方式传递参数?你能给我们整个你正在使用的命令行吗?你必须在类名之前设置参数。如果你把它放在后面,那就可以解释为什么它没有因为你多余的空格而失败了。 - eckes

4
告诉我们你整个命令行,我怀疑你使用的是:
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

1

-Xmx4g(无空格,如已指出)仅设置堆大小的最大值,不会在启动时自动分配全部内存。

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

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

-Xms256m -Xmx2048m -XX:MaxPermSize=256m

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


maxMemory() 应该显示 -Xmx 设置,即使内存没有被提交或使用。所以我猜 Xms 不是问题所在,但指出这一点也是好的。 - eckes

1

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

要告诉JVM堆的初始大小,请同时使用-Xms选项; 例如:

   java -Xmx4g -Xms4g ...

告诉Java使用4g堆,并从开始设置该大小。请注意,这并不一定会立即将所有物理/虚拟内存分配给进程。但是,堆空间的大小应按比例设置为名义初始大小。

(正如其他人所指出的那样,这些是原子选项;即不要在4g之前放置空格。)


如果您知道请求堆的大部分将很快使用,那么设置-Xms可以避免在启动期间重复调整堆大小。但是,如果您的-Xms值显着大于您可能需要的值,则可能会不必要地使用系统资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接