我正在做一些奇特的东西,我真的需要分配大约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)
我真的不知道自己做错了什么。你们中有谁有想法吗?
非常感谢!
答案 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
值远远高于您可能需要的值,那么您最终可能会不必要地使用系统资源。