关于JVM堆参数-Xmx和-Xms

时间:2014-08-03 15:39:11

标签: java jvm jvm-arguments

我有以下代码:

public static void main(String[] args) {
    for(int i=0;i<10;i++) {
        System.out.println(i);
        byte[] b = new byte[1024*1024*5];
    }
}

您会看到每个操作分配5M。当我设置-Xms8M -Xmx8M时,它会毫无例外地成功运行,而当-Xms7M -Xmx7M时,它会抛出OutOfMemoryError异常。有人能解释为什么吗?我在Windows 7,64bit,Eclipse 4.3下。 以下代码是相同的结果:

public static void main(String[] args) {
    byte[] b;
    for(int i=0;i<10;i++) {
        System.out.println(i);
        b = new byte[1024*1024*5];
    }
}

2 个答案:

答案 0 :(得分:1)

你错误地认为该程序只分配了5MB内存,而你错了。 仅仅因为你创建一个5MB的数组并不意味着没有额外的内存用于类加载和其他东西。

所以要回答你的问题,你要为你的过程分配太少的内存。

答案 1 :(得分:1)

因为执行程序涉及创建ClassLoader,加载类,实例化System OutputStream等。这些操作还需要在堆上分配内存。