有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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内存运行这段代码两个小时,我的程序还在运行吗


共 (5) 个答案

  1. # 1 楼答案

    你的代码不会抛出任何异常。甚至OutOfMemoryError也不是因为这个代码:

    for(;;){
        v = new Vector<String>();
        v = null;
    }
    

    v = new Vector<String>();创建的对象可以由垃圾收集器在v = null;行之后回收,因此您的代码将继续。。。永远

    如果您需要StackOverflowerr,请在某个点进行递归调用,而不返回。比如:

    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));更改为v.add(10);,因为向向量添加条目也会消耗内存

  2. # 2 楼答案

    它不需要抛出OfMemory,因为垃圾收集器将释放创建的向量

    你需要保留这些参考资料

    试试下面的代码

    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. # 3 楼答案

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

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

    但是你应该永远不要看到堆栈溢出异常,因为你没有从堆栈中分配内存

  4. # 4 楼答案

    在您的代码中,vector是在循环中创建的,因此它是一个局部变量,您无法访问之前创建的对象

    所以垃圾收集器会把它清理干净。 它不会给你记忆警告

  5. # 5 楼答案

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

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

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