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