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

谁能告诉我,这段代码会在某个时候抛出 StackOverflow 异常还是不会?我尝试使用 min JVM memory 运行此代码 2 小时,我的程序仍在运行吗?

4

5 回答 5

1

当不再有任何对内存的引用时,Java 可以自由地对其进行垃圾收集并将其返回到可用堆中。

您可能会或可能不会看到内存不足异常,具体取决于您开始使用的内存量以及垃圾收集运行的频率。

但是您永远不会看到堆栈溢出异常,因为您没有从堆栈中分配内存。

于 2012-12-09T05:26:38.803 回答
1

在您的代码中,向量是在循环中创建的,因此它是一个局部变量,您无权访问先前创建的对象。

所以垃圾收集器清理它。它不会给你内存警告。

于 2012-12-09T05:35:35.393 回答
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);
     }
   }

}

于 2012-12-09T05:27:11.517 回答
0

您的代码中发生的情况是,每次在内存中创建一个新对象时,它的引用都被设置为 v。

但是一旦循环进入下一次迭代,就会创建一个新对象,并且 v 现在指向该新对象。

不再引用旧对象,因此它将被垃圾收集。因此,随着您的迭代进行,会创建对象并收集垃圾,因此您永远不会耗尽内存或导致堆栈溢出。

于 2012-12-09T05:31:14.353 回答
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));

    }
}

该代码将无限添加一个整数到向量,为这样的整数和向量内的条目分配空间。内存很快就会被耗尽。

您甚至可以更改v.add(new Integer(10));for,v.add(10);因为向向量添加条目也会消耗内存。

于 2012-12-09T05:33:14.873 回答