java无限for循环是否会导致OutOfMemoryException?
public class Test {
static Vector<String> v;
public static void main(String args[]){
for(;;){
v = new Vector<String>();
v = null;
}
}
}
谁能告诉我, 这段代码会在某个时候抛出StackOverflow异常吗? 我试着用最少的JVM内存运行这段代码两个小时,我的程序还在运行吗
# 1 楼答案
你的代码不会抛出任何异常。甚至
OutOfMemoryError
也不是因为这个代码:在
v = new Vector<String>();
创建的对象可以由垃圾收集器在v = null;
行之后回收,因此您的代码将继续。。。永远如果您需要StackOverflowerr,请在某个点进行递归调用,而不返回。比如:
要抛出
OutOfMemoryError
,只需执行以下操作:该代码将无限地向向量中添加一个整数,为该整数和向量中的条目分配空间。记忆很快就会耗尽
甚至可以将
v.add(new Integer(10));
更改为v.add(10);
,因为向向量添加条目也会消耗内存# 2 楼答案
它不需要抛出OfMemory,因为垃圾收集器将释放创建的向量
你需要保留这些参考资料
试试下面的代码
}
# 3 楼答案
当不再有对内存的任何引用时,Java可以对其进行垃圾收集并将其返回到可用堆
您可能会或可能不会看到内存不足异常,这取决于您开始使用的内存量以及垃圾收集运行的频率
但是你应该永远不要看到堆栈溢出异常,因为你没有从堆栈中分配内存
# 4 楼答案
在您的代码中,vector是在循环中创建的,因此它是一个局部变量,您无法访问之前创建的对象
所以垃圾收集器会把它清理干净。 它不会给你记忆警告
# 5 楼答案
代码中发生的事情是,每次在内存中创建一个新对象时,它的引用都被设置为v
但一旦循环进入下一个迭代,就会创建一个新对象,v现在指向该新对象
旧对象不再被引用,因此将被垃圾收集。因此,随着迭代的进行,会创建对象并收集垃圾,这样就永远不会耗尽内存或导致堆栈溢出