Java-Heap-Memory-Fehler

JavaJavaBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden Sie lernen, wie Sie den Java-Heap-Speicher effektiv nutzen, um Java-Heap-Memory-Fehler zu vermeiden.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/DataStructuresGroup -.-> java/arrays("Arrays") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/arraylist("ArrayList") java/SystemandDataProcessingGroup -.-> java/system_methods("System Methods") subgraph Lab Skills java/arrays -.-> lab-117690{{"Java-Heap-Memory-Fehler"}} java/classes_objects -.-> lab-117690{{"Java-Heap-Memory-Fehler"}} java/exceptions -.-> lab-117690{{"Java-Heap-Memory-Fehler"}} java/arraylist -.-> lab-117690{{"Java-Heap-Memory-Fehler"}} java/system_methods -.-> lab-117690{{"Java-Heap-Memory-Fehler"}} end

Java-Heap-Memory-Fehler

Ein Java-Heap-Memory-Fehler tritt auf, wenn die Java Virtual Machine (JVM) während der Zuweisung von Objekten an den Java-Heap-Speicher keinen Speicher mehr hat. Schlechte Programmierpraktiken, Speicherlecks, Drittanbieterbibliotheken können alle zu diesem Fehler führen.

Code:

import java.util.ArrayList;

public class JavaHeapMemoryError {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<Object>();
        while (true) {
            Object o = new Object();
            list.add(o);
        }
    }
}

Um den Fehler in Aktion zu sehen, kompilieren und führen Sie den Code im Terminal aus:

javac JavaHeapMemoryError.java
java -Xmx512m JavaHeapMemoryError

Das Programm versucht, so viel Speicher wie möglich zuzuweisen, indem es kontinuierlich Objekte erstellt und diese zur ArrayList hinzufügt, bis die JVM die OutOfMemoryError auslöst. Der -Xmx-Parameter setzt den maximalen Heap-Speicher, der der JVM zugewiesen wird.

Ursachen für Java-Heap-Memory-Fehler

Ein Java-Heap-Memory-Fehler tritt hauptsächlich aufgrund schlechter Programmierpraktiken, Speicherleckage und Drittanbieterbibliotheken auf. Um ihn zu vermeiden, müssen wir unendliche Schleifen vermeiden, unbelegte Objekte, die zu lange ohne Bereinigung gehalten werden, vermeiden und unbelegte Objekte dem Garbage Collector zur Verfügung stellen.

Code:

public class JavaHeapMemoryError {
    public static void main(String[] args) {
        int[] arr = new int[100000000];
        for(int i=0; i<arr.length; i++){
            arr[i] = i;
        }
        System.out.println("Memory allocated");
    }
}

Um den Code in Aktion zu sehen, kompilieren und führen Sie den Code im Terminal aus:

javac JavaHeapMemoryError.java
java -Xmx256m JavaHeapMemoryError

Speicherleck

Ein Speicherleck tritt auf, wenn ein unbelegtes Objekt im Heap-Speicher immer noch gültige Referenzen hat und nicht vom Garbage Collector entfernt werden kann. Um Speicherlecks zu vermeiden, müssen alle offenen Ressourcen mit dem finally-Block geschlossen werden.

Code:

public class MemoryLeak {
    static ArrayList<String> arrList = new ArrayList<String>(500);
    public static void main(String args[]) {
        for (int i = 0; i < 500; i++) {
            arrList.add("Element " + i);
        }
        arrList = null;
    }
}

Um den Code in Aktion zu sehen, kompilieren und führen Sie den Code im Terminal aus:

javac MemoryLeak.java
java -Xmx256m MemoryLeak

Übermäßige Verwendung von Finalisern

Die übermäßige Verwendung von Finalisern kann zu einem Java-Heap-Memory-Fehler führen, da Klassen, die eine finalize-Methode enthalten, während der Garbage Collection nicht ihre Objektbereiche freigegeben werden.

Code:

public class ExcessiveFinalizer {
    public void finalize() {
        //Do some cleanup
    }

    public static void main(String[] args) {
        ArrayList<ExcessiveFinalizer> list = new ArrayList<ExcessiveFinalizer>();
        while (true) {
            list.add(new ExcessiveFinalizer());
        }
    }
}

Um den Code in Aktion zu sehen, kompilieren und führen Sie den Code im Terminal aus:

javac ExcessiveFinalizer.java
java -Xmx256m ExcessiveFinalizer

Heap-Speicher erhöhen

Wenn der Fehler durch einen zu geringen für die JVM zugewiesenen Speicher verursacht wurde, können wir den verfügbaren Heap-Speicher erhöhen, indem wir die von der -Xmx-Option festgelegte Grenze erhöhen.

Code:

public class IncreaseHeapMemory {
    public static void main(String[] args) {
        Integer[] outOfMemoryArray = new Integer[Integer.MAX_VALUE];
    }
}

Um den Code in Aktion zu sehen, kompilieren und führen Sie den Code im Terminal aus:

javac IncreaseHeapMemory.java
java -Xmx8g IncreaseHeapMemory

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Heap-Speicher für Ihre Java-Anwendungen effektiv verwalten, um Java-Heap-Memory-Fehler zu vermeiden. Wir haben verschiedene Techniken untersucht, um den Fehler zu verhindern, wie das Vermeiden ineffizienter Schleifen, das Schließen unbelegter Ressourcen und das frühzeitige Zur Verfügung stellen unbelegter Objekte für den Garbage Collector. Schließlich haben wir die Grenze erhöht, wenn ein zu geringer Heap-Speicher der Fehlerursache war, indem wir die -Xmx-Option verwendet haben.