无限循环导致OutOfMemoryException与否?

时间:2012-12-09 05:23:57

标签: java out-of-memory

public class Test {
    static Vector<String> v;
    public static void main(String args[]){
        for(;;){
            v = new Vector<String>();
            v = null;
        }
    }   
}

任何人都可以告诉我, 这段代码会在某个时候抛出StackOverflow异常还是不会? 我尝试使用min JVM内存运行此代码2小时,我的程序仍在运行?

5 个答案:

答案 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);,因为向矢量添加条目也会消耗内存。