Java 这段代码为什么会导致jvm抛出OutOfMemoryError

public class Test{
public static void main(String[] args)throws Exception{
try{
Object[] o = null;
while (true) {
o = new Object[] { o };
}
}catch(OutOfMemoryError e){
System.out.println("out of memory");
}
}
}
以上这段代码运行一会儿会抛error
public class Test{
public static void main(String[] args)throws Exception{
try{
Object[] o = null;
while (true) {
//o = new Object[] { o };
o = new Object[1];
o[0] = o;
}
}catch(OutOfMemoryError e){
System.out.println("out of memory");
}
}
}
下面这段却不会抛出error

o = new Object[] { o }; 放的是堆内存的数据。申请额外的内存空间
o = new Object[1];o[0] = o;直接是赋值。没有申请额外的内存空间
图片说明图片说明

第一种情况的

o = new Object[] {o};

相当于

Object[] tmp = new Object[1];
tmp[0] = o;
o = tmp;

但是第二种情况的

o = new Object[1];
o[0] = o;

相当于

o = null;
o = new Object[1];
o[0] = o;

明白了吗~

第一种情况的问题在于,每次循环都把旧的o数组包在了一个新的o数组之内,使得o数组越来越深;
第二种情况中,直接把o赋值为全新的空数组,上次循环的内容完全丢弃掉了,每次循环都是相同的结果,不会导致溢出。