2014-08-30 165 views
1

我正在做一些花哨的东西,我真的需要分配大约1 GB。Java堆空间不会增加使用-Xmx 1g

我的电脑有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) 

我真的不知道我在做什么错。你们中有人有想法吗?

非常感谢!

回答

1

它是-Xmx4g,两者之间没有空格。

+0

-Xmx4g它没有什么不同,它仍然不起作用 – Daniel 2014-08-30 22:03:18

+0

@Daniel如果它没有帮助,那么你可能是以错误的方式传递参数?你能给我们你正在使用的整个命令行吗?您必须在类名前面设置参数。如果你把它放在后面,它会解释为什么它没有失败,你的超级空白。 – eckes 2014-08-31 00:55:59

0

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

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

通常,人们在应用程序启动时将这些设置为一对。例如推出使用类产生大量的运行时生成的类的

-Xms256m -Xmx2048m -XX服务器...当:MaxPermSize参数=256米

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

+0

即使未提交或使用内存,maxMemory()应显示-Xmx设置。所以我想Xms在这里不是问题,但是很好指出。 – eckes 2014-08-31 00:55:13

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 
0

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

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

java -xmx4g -xsx4g ... 

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

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


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