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:
-
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).
-
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.
-
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.
- Stocke les informations sur les classes chargées:
-
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) |