ホームページ  >  記事  >  Java  >  Java メモリ オーバーフローはどのような状況で発生する可能性がありますか?

Java メモリ オーバーフローはどのような状況で発生する可能性がありますか?

WBOY
WBOY転載
2023-05-09 16:19:231376ブラウズ

1. ヒープ オーバーフロー、ヒープにはインスタンス オブジェクトが格納されますが、遅かれ早かれヒープ領域はいっぱいになります。ヒープ領域メモリが設定されている場合、作成時に例外がスローされます。

public class HeapOOM {
    static class User {}
    public static void main(String[] args) {
         List<User> list = new ArrayList<User>();
            while (true) {
                list.add(new User());
         }
    }
}
/*Exception in thread "main" java.lang.OutOfMemoryError:
GC overhead limit exceeded
at com.fdd.test.HeapOOM.main(HeapOOM.java:11)*/

2. 仮想マシン スタックとローカル メソッド スタックのオーバーフロー

スレッドが必要とするスタックの深さが、仮想マシンのロックで許可される深さよりも大きい場合、 StackOverflowError 例外がスローされます。

スタックを拡張するときに仮想マシンが十分なストレージ領域を適用できない場合、例外が発生します。

public class StackOutOfMemoryError {
    public static void main(String[] args) {     
         test();
    }
    private static void go() {
        System.out.println("StackOverflowError异常");
        test();
    }
}
/*Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.ext.DoubleByte$Encoder.encodeLoop(DoubleByte.java:617)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
    at java.io.PrintStream.write(PrintStream.java:526)
    at java.io.PrintStream.print(PrintStream.java:597)
    at java.io.PrintStream.println(PrintStream.java:736)
    at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:11)
at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:13)*/

3. メソッド領域とランタイム定数プールのオーバーフロー

4. ネイティブ ダイレクト メモリのオーバーフロー

DirectMemory 容量指定しない場合、デフォルトは Java ヒープの値 (-Xmx で指定) と同じになります。

以上がJava メモリ オーバーフローはどのような状況で発生する可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。