0

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

本质上,我想指定当我的程序运行时,VM 的最小/初始堆大小为 2Gb。我可以使用 -Xms2048m 命令来做到这一点,但我想知道是否有某种方法可以实现这一点而无需键入命令(为了客户的缘故)。

即使我在 NetBeans 和 Launch4J 中设置了 VM 参数(我将 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

4 回答 4

1

做到这一点的唯一方法是让程序用你想要的堆启动另一个程序副本。注意:最终用户可能不想要 2 GB,例如

如果他们有 32 位 Windows,他们不能,例如,如果他们的默认值只有 120 MB,他们很可能有一个 32 位 Windows 客户端 JVM,它不能是 2 GB。如果他们有 32 GB 或更多,他们可能需要超过 2 GB。

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

于 2013-07-24T22:32:51.850 回答
0

如果 GC 确定分配了太多未使用的堆空间,则堆能够在 GC 迭代后收缩。也许这就是在您的应用程序启动后它每次都会向您显示相同大小的方式。

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

C:\Users\AStybaev>java -X
...
-Xms<size>        set initial Java heap size
...
于 2013-07-24T13:15:08.923 回答
0

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

在oracle 论坛上进行了一些有用的讨论。

并且在 SO 上:以编程方式设置最大 java 堆大小

于 2013-07-24T13:09:50.953 回答
0

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

于 2013-07-24T13:01:48.420 回答