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

誰でも教えてください、このコードはいつかStackOverflow Exceptionをスローしますか、それともスローしませんか? このコードを min JVM memory で 2 時間実行してみましたが、プログラムはまだ実行中ですか?

4

5 に答える 5

1

コードでは、vectorはループで作成されるため、ローカル変数であり、以前に作成されたオブジェクトにアクセスできません。

したがって、ガベージコレクターはそれをクリーンアップします。それはあなたに記憶の警告を与えません。

于 2012-12-09T05:35:35.393 に答える
1

メモリへの参照がなくなると、Java は自由にガベージ コレクションを行い、使用可能なヒープに戻します。

開始時のメモリ量とガベージ コレクションの実行頻度によっては、メモリ不足の例外が表示される場合と表示されない場合があります。

ただし、スタックからメモリを割り当てていないため、スタック オーバーフローの例外が発生することはありません

于 2012-12-09T05:26:38.803 に答える
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 に答える