我有以下代码:
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];
}
}
答案 0 :(得分:1)
你错误地认为该程序只分配了5MB内存,而你错了。 仅仅因为你创建一个5MB的数组并不意味着没有额外的内存用于类加载和其他东西。
所以要回答你的问题,你要为你的过程分配太少的内存。
答案 1 :(得分:1)
因为执行程序涉及创建ClassLoader,加载类,实例化System OutputStream等。这些操作还需要在堆上分配内存。