Heim  >  Artikel  >  Java  >  Welche Situationen können zu einem Java-Speicherüberlauf führen?

Welche Situationen können zu einem Java-Speicherüberlauf führen?

WBOY
WBOYnach vorne
2023-05-09 16:19:231376Durchsuche

1. Heap-Überlauf, Der Heap speichert Instanzobjekte, aber früher oder später wird der Heap-Bereich voll sein. Wenn der Heap-Bereichsspeicher festgelegt ist, wird beim Erstellen eine Ausnahme ausgelöst.

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. Überlauf des Stapels der virtuellen Maschine und des lokalen Methodenstapels

Wenn die vom Thread benötigte Stapeltiefe größer ist als die zulässige Tiefe Die Sperre der virtuellen Maschine löst dann eine StackOverflowError-Ausnahme aus.

Wenn die virtuelle Maschine beim Erweitern des Stapels nicht genügend Speicherplatz beantragen kann, tritt eine Ausnahme auf.

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. Methodenbereich und Laufzeitkonstanten-Pool-Überlauf

4. Nativer direkter Speicherüberlauf #🎜 🎜#

DirectMemory-Kapazität kann durch -XX:MaxDirectMemorySize angegeben werden. Wenn nicht angegeben, ist der Standardwert derselbe wie der Wert des Java-Heaps (angegeben durch -Xmx).

Das obige ist der detaillierte Inhalt vonWelche Situationen können zu einem Java-Speicherüberlauf führen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen