Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Java

Java Stack vs Heap : Guide Pratique d'Allocation Mémoire

Qu'est-ce que la Mémoire Stack ?

En Java, la pile (stack) est une région de mémoire contigüe qui contient les cadres d'appel de méthodes, les variables locales et les variables de référence. Chaque fois qu'une méthode est invoquée, un nouveau cadre est empilé sur la pile. La mémoire stack est organisée selon le principe Last-In, First-Out (LIFO), ce qui signifie que l'appel le plus récent est le premier à être retiré lorsque la méthode se termine.

Qu'est-ce que la Mémoire Heap ?

Le tas (heap) est la zone où les objets Java sont créés. Il contient toutes les instances de classes et, éventuellement, les variables de référence qui pointent vers ces objets. Contrairement à la pile, le tas n'est pas lié à la durée de vie d'un seul appel de méthode, permettant aux objets de persister au-delà de la portée dans laquelle ils ont été créés.

Allocation Mémoire en Java

L'allocation mémoire en Java désigne le processus de réservation de mémoire virtuelle pour les données du programme. Les variables ne sont pas allouées à la déclaration ; au lieu de cela, une référence est créée. Lorsque l'opérateur new est utilisé, la JVM alloue de l'espace sur le tas pour l'objet.

Java divise la mémoire en quatre sections distinctes pour une gestion efficace :

  1. Heap (Tas)
  2. Stack (Pile)
  3. Code (Bytecode)
  4. Static (Données de classe)

Variables Locales vs Variables d'Instance

Les variables d'instance sont déclarées dans une classe mais en dehors de toute méthode :

class Etudiant {
    int num; // variable d'instance
    public void showData() {}
}

Les variables locales sont déclarées à l'intérieur d'une méthode (ou comme paramètres de méthode) :

public void sum(int a) {
    int x = a + 3; // a et x sont des variables locales
}

Stack vs Heap en Action

Examinons un exemple pour illustrer l'interaction entre la pile et le tas lors d'appels de méthodes.

Supposons que la méthode main appelle m1() :

public void m1() {
    int x = 20;
}

Un cadre pour m1 est empilé sur la pile. La variable locale x est stockée dans ce cadre.

Java Stack vs Heap : Guide Pratique d Allocation Mémoire

Lorsque m1 appelle m2(int b), un nouveau cadre est ajouté au-dessus de celui de m1 :

public void m2(int b) {
    boolean c;
}
Java Stack vs Heap : Guide Pratique d Allocation Mémoire

De même, m2 appelle m3(), créant un autre cadre :

Java Stack vs Heap : Guide Pratique d Allocation Mémoire

À l'intérieur de m3, un objet Compte est instancié sur le tas, tandis que sa référence ref vit sur la pile :

class Compte {
    int p;
    int q;
}
public void m3() {
    Compte ref = new Compte(); // code additionnel
}
Java Stack vs Heap : Guide Pratique d Allocation Mémoire

La variable de référence ref est créée dans le cadre de pile de m3 et pointe vers l'objet Compte alloué sur le tas.

Java Stack vs Heap : Guide Pratique d Allocation Mémoire

Lorsque m3 se termine, son cadre de pile est dépilé, laissant l'objet Compte sans aucune référence. Il devient éligible au garbage collection.

Java Stack vs Heap : Guide Pratique d Allocation Mémoire

Le même processus se répète pour m2 et m1, rendant finalement le contrôle à main.

Références d'Objets comme Variables d'Instance

Considérez une classe A qui contient une référence vers une instance de B :

public static void main(String[] args) {
    A parent = new A(); // code additionnel
}
class A {
    B child = new B();
    int e;
}
class B {
    int c;
    int d;
}

Ici, la référence child est stockée sur le tas en tant que partie de l'objet A, pointant vers sa propre instance B.

Java Stack vs Heap : Guide Pratique d Allocation Mémoire

Points Clés à Retenir

Java

  1. Variables et littéraux en Java : Guide complet
  2. Classes et objets en Java : Guide pratique
  3. Classes et méthodes abstraites en Java : guide complet
  4. Maîtriser les classes imbriquées et internes en Java : types, exemples et bonnes pratiques
  5. Java throw vs throws : maîtriser la gestion d'exceptions avec exemples pratiques
  6. Types d'annotations Java : guide complet des annotations prédéfinies, personnalisées et méta
  7. Maîtriser l'autoboxing et l'unboxing Java : Exemples pratiques et bonnes pratiques
  8. Maîtriser le remplacement de chaînes Java : replace(), replaceAll() et replaceFirst() expliqués
  9. Redéfinition de méthodes Java : Personnaliser le comportement de la superclasse