Erreur de mémoire Java Heap

JavaJavaBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous allez apprendre à utiliser efficacement la mémoire Java Heap pour éviter les erreurs de mémoire Java Heap.


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{{"Erreur de mémoire Java Heap"}} java/classes_objects -.-> lab-117690{{"Erreur de mémoire Java Heap"}} java/exceptions -.-> lab-117690{{"Erreur de mémoire Java Heap"}} java/arraylist -.-> lab-117690{{"Erreur de mémoire Java Heap"}} java/system_methods -.-> lab-117690{{"Erreur de mémoire Java Heap"}} end

Erreur de mémoire Java Heap

L'erreur de mémoire Java Heap se produit lorsque la Machine virtuelle Java (JVM) s'exhause en mémoire lors de l'allocation d'objets à la mémoire Java Heap. De mauvaises pratiques de programmation, des fuites de mémoire, des bibliothèques tierces peuvent tous entraîner cette erreur.

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);
        }
    }
}

Pour voir l'erreur en action, compilez et exécutez le code dans le terminal :

javac JavaHeapMemoryError.java
java -Xmx512m JavaHeapMemoryError

Le programme essaie d'allouer autant de mémoire que possible en créant continuellement des objets et en les ajoutant à l'ArrayList jusqu'à ce que la JVM lève l'erreur OutOfMemoryError. Le paramètre -Xmx définit la mémoire tampon maximale allouée à la JVM.

Causes of Java Heap Memory Error

L'erreur de mémoire Java Heap se produit principalement en raison de mauvaises pratiques de programmation, de fuites de mémoire et de bibliothèques tierces. Pour la prévenir, nous devons éviter les boucles infinies, les objets inutilisés maintenus trop longtemps sans être nettoyés et rendre les objets inutilisés disponibles pour le ramasse-miettes.

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");
    }
}

Pour voir le code en action, compilez et exécutez le code dans le terminal :

javac JavaHeapMemoryError.java
java -Xmx256m JavaHeapMemoryError

Fuite de mémoire

Une fuite de mémoire se produit lorsqu'un objet inutilisé dans la mémoire tampon possède encore des références valides et ne peut pas être supprimé par le ramasse-miettes. Pour éviter les fuites de mémoire, toutes les ressources ouvertes doivent être fermées à l'aide du finally block.

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;
    }
}

Pour voir le code en action, compilez et exécutez le code dans le terminal :

javac MemoryLeak.java
java -Xmx256m MemoryLeak

Utilisation excessive de finalizers

L'utilisation excessive de finalizers peut entraîner une erreur de mémoire Java Heap car les classes qui contiennent une méthode finalize n'ont pas leurs espaces d'objets récupérés lors de la collecte de déchets.

Code :

public class ExcessiveFinalizer {
    public void finalize() {
        //Effectuez quelques nettoyages
    }

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

Pour voir le code en action, compilez et exécutez le code dans le terminal :

javac ExcessiveFinalizer.java
java -Xmx256m ExcessiveFinalizer

Augmenter la mémoire tampon

Si l'erreur est due à une mémoire insuffisante allouée à la JVM, nous pouvons augmenter l'espace mémoire tampon disponible en augmentant la limite définie par la commande -Xmx.

Code :

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

Pour voir le code en action, compilez et exécutez le code dans le terminal :

javac IncreaseHeapMemory.java
java -Xmx8g IncreaseHeapMemory

Sommaire

Dans ce laboratoire, vous avez appris à gérer efficacement la mémoire tampon pour vos applications Java afin d'éviter les erreurs de mémoire Java Heap. Nous avons exploré différentes techniques pour prévenir l'erreur, telles que l'évitement de boucles inefficaces, la fermeture des ressources inutilisées et la mise à disposition des objets inutilisés pour le ramasse-miettes dès le début. Enfin, si une mémoire tampon insuffisante était la cause de l'erreur, nous avons augmenté la limite à l'aide de la commande -Xmx.