关于VM参数

时间:2013-07-24 13:00:05

标签: java memory jvm arguments heap

我是否正确地认为当在IDE中指定VM参数时(我在此实例中使用NetBeans),这些参数仅在代码通过IDE本身运行时传递?

基本上,我想指定当程序运行时,VM的最小/初始堆大小为2Gb。我可以使用-Xms2048m命令执行此操作,但我想知道是否有某种方法可以实现此目的而无需键入命令(为了客户的利益)。

当程序启动时,我甚至认为我在NetBeans中设置了VM参数,并将Launch4J(我将JAR包装到EXE文件中)。输出运行时的总内存大小,总是给出~120Mb。

我错过了什么?

编辑:我使用...

输出总内存大小
 int mb = 1024 * 1024;
 System.out.println("Max Memory: " + Runtime.getRuntime().totalMemory() / mb);

编辑2:是否可以创建一个不带参数的初始化程序,但是使用相关的VM参数启动主程序?有点像...

public class Main {
    public static void main(String[] args) {
        String execName = new File(new File("").getAbsolutePath()) + "\\Program.exe";
        Runtime rt = Runtime.getRuntime();
        rt.exec("java -Xms2048m -Xmx4096m -jar " + execName);
    }
}

4 个答案:

答案 0 :(得分:1)

执行此操作的唯一方法是让程序以您想要的堆启动程序的另一个副本。注意:最终用户可能不需要2 GB,例如

如果他们有32位窗口,他们就不能如果它们的默认值仅为120 MB,则它们很可能具有32位Windows客户端JVM,不能为2 GB。如果它们具有32 GB或更多,则可能需要超过2 GB。

BTW Gb =千兆位,Mb =兆位,GB =千兆字节。 MB =兆字节。

答案 1 :(得分:0)

,您无法以编程方式更改堆大小。命令行是唯一的方法

答案 2 :(得分:0)

由于必须在JVM values期间设置initialization您不能

关于oracle forums.

的一些有用的讨论

在SO:programatically setting max java heap size

答案 3 :(得分:0)

如果GC确定分配了太多未使用的堆空间,则在GC迭代后堆可以shrink。也许这是应用程序启动后的方式,每次都显示相同的大小。

而且-Xms似乎设置了堆的初始大小,而不是最小值

C:\Users\AStybaev>java -X
...
-Xms<size>        set initial Java heap size
...