Sobes.tech
Middle

Comment la mémoire est-elle organisée en Java?

sobes.tech IA

Réponse de l'IA

En Java, la mémoire est gérée automatiquement par le ramasse-miettes et est divisée en plusieurs zones:

  1. Heap (Tas):

    • Stocke les objets de classes et les tableaux.
    • Une seule pour tous les threads de l'application.
    • Le ramasse-miettes travaille avec cette zone.
    • Divisée en générations (Jeune, Vieux, Permanente).
  2. Stack (Pile):

    • Chaque thread a sa propre pile.
    • Stocke les variables locales de types primitifs et les références aux objets dans le tas.
    • Les données sont ajoutées et supprimées selon le principe LIFO (Last-In, First-Out).
    • Libérée automatiquement à la fin de la méthode.
  3. Method Area (Zone de méthodes) / PermGen (jusqu'à Java 8) / Metaspace (à partir de Java 8):

    • Stocke les informations sur les classes chargées:
      • Métadonnées des classes.
      • Bytecode des méthodes.
      • Variables statiques.
      • Constantes du pool.
    • La taille de PermGen était fixe, Metaspace utilise la mémoire native et peut s'étendre dynamiquement.
  4. Native Method Stacks (Piles de méthodes natives):

    • Utilisé pour les appels aux méthodes natives (par exemple, C/C++).
    • Libérée à la fin de la méthode native.
// Exemple d'utilisation de mémoire
public class MemoryExample {

    private String instanceVariable; // Stockée dans le Heap

    public void myMethod(int parameter) { // parameter stocké dans la Stack

        int localVar = 10; // localVar dans la Stack

        String localString = "hello"; // "hello" dans le String Pool (partie du Heap/Method Area), la référence localString dans la Stack

        Object obj = new Object(); // Object dans le Heap, la référence obj dans la Stack

        Integer wrapper = new Integer(5); // Integer dans le Heap, la référence wrapper dans la Stack
    }

    public static void main(String[] args) {
        MemoryExample example = new MemoryExample();
        example.myMethod(20);
    }
}

Zones de mémoire et leur contenu:

Zone Où se trouve-t-elle? Que stocke-t-elle? Gestion
Heap Partagé pour la JVM Objets, tableaux Ramasse-miettes
Stack Propre à chaque thread Variables locales primitives, références aux objets Automatique (à la fin de la méthode)
Method Area Partagé pour la JVM Métadonnées de classes, variables statiques, bytecode, constantes Ramasse-miettes (pour classes et statiques)
Native Stacks Propre à chaque thread (lors de l'appel) Variables et données des méthodes natives Automatique (à la fin de la méthode native)