1
package com.atul;

public class StackOverFlow {

    public StackOverFlow() {
        callStackOverFlow();
    }

    public void callStackOverFlow() {
        StackOverFlow st = new  StackOverFlow();
    }

    public static void main(String[] args) {
        StackOverFlow st2 = new StackOverFlow();
    }
}

上記のプログラムでは、OutOfMemory エラーを取得しようとしていましたが、StackOverFlow エラーが発生します。私の知る限り、すべてのオブジェクトはヒープに作成されます。ここでは、コンストラクターで再帰を行っていますが、それでも StackOverFlow エラーが発生します。

なんで?

4

3 に答える 3

7

ヒープ メモリが不足するずっと前に、スタック (単純なケースでは最大深度が約 10,000 です) が不足します。これは、すべてのスレッドが独自のスタックを持っているため、共有ヒープよりもはるかに小さくする必要があるためです。

メモリを使い果たしたい場合は、ヒープをより速く使い果たす必要があります。

public class OutOfMemoryMain {
    byte[] bytes = new byte[100*1024*1024];
    OutOfMemoryMain main = new OutOfMemoryMain();

    public static void main(String... args) {
        new OutOfMemoryMain();
    }
}
于 2012-10-02T08:25:08.230 に答える
1

JVM のスタック サイズは(スレッドごとに)制限-Xssされており、 .

OOM を生成したい場合は、無限にループし、ループごとに新しいオブジェクトをインスタンス化し、それをコレクションに格納することをお勧めします (そうしないと、ガベージ コレクションによって各インスタンスが破棄されます)。

于 2012-10-02T08:25:05.920 に答える
0

メモリがオブジェクトでいっぱいになり、メモリ不足のためにプログラムが異常終了する前。メソッド呼び出しを保存するスタックが不足したため、Stackoverflowエラーが発生します。

オブジェクトがヒープスペースをいっぱいにすると、オーバーフローエラーが発生します...

于 2012-10-02T08:27:05.307 に答える