Maison  >  Article  >  Java  >  Heap vs Stack : comment Java gère ce qu'il faut retenir ou oublier

Heap vs Stack : comment Java gère ce qu'il faut retenir ou oublier

PHPz
PHPzoriginal
2024-09-08 16:32:02315parcourir

Lorsque nous exécutons un programme, le système d'exploitation alloue de la mémoire pour que cette application puisse stocker des données et les récupérer aussi longtemps que nécessaire. Contrairement au C ou au C++, dans lesquels le programmeur a la liberté d'allouer de la mémoire et de gérer les pointeurs "à la main", en Java, la JVM (Java Virtual Machine) gère le stockage volatile, résumant pour nous cette complexité dans deux systèmes d'allocation, le Heap et le Pile.

La différence entre eux réside dans la finalité du stockage et la nécessité (ou non) de partager ces données avec plusieurs processus.

La JVM utilise la Stack pour les données à court terme et suit une structure LIFO (Last In First Out). La Stack est une zone mémoire utilisée pour gérer l'exécution des méthodes, stocker les variables locales et les appels de méthodes de manière organisée dans des frames. Chaque thread de la JVM possède sa propre pile.

Le Heap est une zone de mémoire globale partagée entre tous les threads, où sont alloués des objets et des variables qui doivent avoir une durée de vie utile au-delà de la portée de la méthode qui les a créés.

La mémoire sur le tas est gérée par le Garbage Collector, qui supprime les objets non référencés pour libérer de l'espace, utilisé pour les données à long terme.

Utilisons un exemple pratique.

Lorsqu'une variable primitive est créée dans le cadre d'une méthode, elle doit être disponible pour être utilisée pendant l'exécution de la méthode. De cette façon, c'est Stack qui stockera cette variable, car il est responsable du cycle de vie des données qui ont une utilisation unique et spécifique dans le programme.

Cependant, lorsqu'une méthode crée une instance, cet objet peut être utilisé dans d'autres parties du programme, et pas seulement là où il a été déclaré. Cela se produit clairement lorsque nous créons un objet qui représente un enregistrement dans la base de données. Dans notre programme, cette même instance peut être consultée, éditée et supprimée tout au long d'une exécution. De cette façon, Heap se chargera de stocker l'objet.

Pour illustrer ce point, j'utiliserai un exemple simple que l'auteur Hanumant Deshmukh décrit dans son guide "OCP Java SE 17/21 Programmer Exam Fundamentals". Ce livre, soit dit en passant, est merveilleux, car il parvient à être très didactique en expliquant des processus assez complexes. Je le recommande vivement si vous recherchez, comme moi, la certification Oracle Certified Professional (OCP). L'auteur utilise une instance de String à des fins pédagogiques, mais je vais utiliser ici un objet personnalisé juste pour éviter le risque de violation du droit d'auteur (:S)

public class Main {
    public static void main(String[] args) {
        HeapObj heapObject = newObject();
        int counter = 0;

        while (counter++ < 10){
            print(heapObject.getName());
        }
    }

    public static HeapObj newObject(){
        return new HeapObj("Happy instance");
    }

    public static void print(String text){
        System.out.println(text);
    }
}

Dans l'exemple, la classe Main appelle trois méthodes : la principale, celle qui crée l'instance de l'objet HeapObj et une autre qui imprime simplement le texte.

Si nous prenions une photo alors que toutes les méthodes ont déjà été appelées, le Stack et le Heap ressembleraient à ceci :

Heap vs Stack: como o Java gerencia o que deve ser lembrado ou esquecido

En d'autres termes :

1. Au démarrage :

Pile : cadre principal (contient des arguments, un heapObject, un compteur).
Tas : vide.

2. Après newObject :

Pile : cadre principal (contient des arguments, une référence heapObject, un compteur).
Heap : Un objet HeapObj avec la chaîne "Happy instance".

3. Pendant la boucle :

Pile : cadre principal (contient des arguments, une référence heapObject, un compteur), plusieurs cadres d'impression empilés et dépilés.
Heap : Le même objet HeapObj et la chaîne "Happy instance".

4. Après la boucle :

Pile : cadre principal (contient des arguments, une référence heapObject).
Heap : Le même objet HeapObj et la chaîne "Happy instance".

5. À la fin du programme :

Pile : vide.
Tas : vide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn