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

任何人都可以告訴我, 此代碼是否會在某個時候拋出StackOverflow異常,或者它不會? 我試着用min JVM內存運行這段代碼2小時,我的程序仍在運行?無限for循環會導致OutOfMemoryException?

+0

你必須保留所有的引用,將它們粘在一個數組或其他東西中。 – dakotapearl

+1

你已經證明它不會。下一個問題。 –

+0

@HovercraftFullOfEels +1 – ElderMael

回答

1

當不再有任何對內存的引用時,Java可以自由地對其進行垃圾回收並將其返回給可用堆。

您可能會看到內存不足異常,具體取決於您啓動的內存量以及垃圾收集的運行頻率。

但是你應該從來沒有看到堆棧溢出異常,因爲你沒有從堆棧分配內存。

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); 
    } 
    } 

}

0

什麼在你的代碼的情況是,每一個新的對象在內存中創建的基準被設置爲訴

但隨着時間的一旦循環進行到下一次迭代,就會創建一個新對象,並且v現在指向該新對象。

舊對象不再被引用,因此它將被垃圾收集。因此,隨着迭代的進行,將創建對象並收集垃圾,這樣就不會出現內存不足或導致堆棧溢出的情況。

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));v.add(10);,因爲向該向量添加條目也消耗內存。

1

在你的代碼中,矢量是在一個循環中創建的,因此它是一個局部變量,你不能訪問先前創建的對象。

所以垃圾收集器清理它。 它不會給你記憶警告。