首頁 >Java >java教程 >有哪些情況會導致Java記憶體溢出?

有哪些情況會導致Java記憶體溢出?

WBOY
WBOY轉載
2023-05-09 16:19:231466瀏覽

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、虛擬機器堆疊和本機方法堆疊溢位

如果執行緒要求的堆疊深度大於虛擬機器鎖定允許的深度,則拋出StackOverflowEror例外。

如果虛擬機器在擴展堆疊時無法申請足夠的儲存空間,則會出現異常。

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容量可透過-XX:MaxDirectMemorySize指定,如不指定,預設與Java堆的值(-Xmx指定)相同。

以上是有哪些情況會導致Java記憶體溢出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除