En Java, gestion de la mémoire est un processus vital. Il est géré automatiquement par Java. La JVM divise la mémoire en deux parties : empiler mémoire et mémoire tas. Du point de vue de Java, les deux sont des zones de mémoire importantes, mais toutes deux sont utilisées à des fins différentes. Le différence majeure entre la mémoire pile et la mémoire tas est que la pile est utilisée pour stocker l'ordre d'exécution de la méthode et les variables locales tandis que la mémoire tas stocke les objets et utilise l'allocation et la désallocation dynamiques de mémoire. Dans cette section, nous discuterons en détail des différences entre la pile et le tas.
Mémoire de pile
La mémoire de pile est un espace physique (en RAM) alloué à chaque thread au moment de l'exécution. Il est créé lors de la création d'un thread. La gestion de la mémoire dans la pile suit l'ordre LIFO (Last-In-First-Out) car elle est accessible globalement. Il stocke les variables, les références aux objets et les résultats partiels. La mémoire allouée à la pile dure jusqu'au retour de la fonction. S'il n'y a pas d'espace pour créer les nouveaux objets, il lance lejava.lang.StackOverFlowError. La portée des éléments est limitée à leurs threads. Le JVM crée une pile distincte pour chaque thread.
Mémoire de tas
Il est créé au démarrage de la JVM et utilisé par l'application tant que l'application s'exécute. Il stocke les objets et les classes JRE. Chaque fois que nous créons des objets, ils occupent de l'espace dans la mémoire du tas tandis que la référence de cet objet est créée dans la pile. Il ne suit aucun ordre comme la pile. Il gère dynamiquement les blocs de mémoire. Cela signifie que nous n'avons pas besoin de gérer la mémoire manuellement. Pour gérer automatiquement la mémoire, Java fournit le garbage collector qui supprime les objets qui ne sont plus utilisés. La mémoire allouée au tas dure jusqu'à ce qu'un événement, soit un programme terminé, soit une mémoire libre, ne se produise pas. Les éléments sont globalement accessibles dans l'application. Il s'agit d'un espace mémoire commun partagé avec tous les threads. Si l'espace du tas est plein, il lance lejava.lang.OutOfMemoryError. La mémoire tas est divisée en zones de mémoire suivantes :
- Jeune génération
- Espace survivant
- Ancienne génération
- Génération permanente
- Cache de codes
L'image suivante montre l'allocation de la mémoire de la pile et de l'espace du tas.
Différence entre la mémoire pile et la mémoire tas
Le tableau suivant résume toutes les principales différences entre la mémoire de pile et l'espace de tas.
Paramètre | Mémoire de pile | Espace de tas |
---|---|---|
Application | Il stocke des objets qui ont une durée de vie très courte comme méthodes, variables, et variables de référence des objets. | Il stocke objets et environnement d'exécution Java ( JRE ) Des classes. |
Commande | Il suit le LIFO commande. | Il ne suit aucun ordre car il s’agit d’une allocation de mémoire dynamique et n’a aucun modèle fixe d’allocation et de désallocation de blocs de mémoire. |
La flexibilité | C'est pas flexible car nous ne pouvons pas modifier la mémoire allouée. | C'est flexible car nous pouvons modifier la mémoire allouée. |
Efficacité | Il a plus rapide accès, allocation et désallocation. | Il a Ralentissez accès, allocation et désallocation. |
Taille mémoire | C'est plus petit en taille. | C'est plus grand en taille. |
Options Java utilisées | Nous pouvons augmenter la taille de la pile en utilisant l'option JVM -Xss. | Nous pouvons augmenter ou diminuer la taille de la mémoire du tas en utilisant les options -Xmx et -Xms JVM. |
Visibilité ou portée | Les variables ne sont visibles que par le thread propriétaire. | Il est visible sur tous les sujets. |
Génération d'espace | Lorsqu'un thread est créé, le système d'exploitation alloue automatiquement la pile. | Pour créer l'espace de mémoire pour l'application, le langage appelle d'abord le système d'exploitation au moment de l'exécution. |
Distribution | Une pile distincte est créée pour chaque objet. | Il est partagé entre tous les fils de discussion. |
Lancements d'exceptions | JVM lance le java.lang.StackOverFlowError si la taille de la pile est supérieure à la limite. Pour éviter cette erreur, augmentez la taille de la pile. | JVM lance le java.lang.OutOfMemoryError si la JVM ne parvient pas à créer une nouvelle méthode native. |
Allocation/Désallocation | Cela se fait automatiquement par le compilateur . | Cela se fait manuellement par le programmeur . |
Coût | Son coût est moins . | Son coût est plus par rapport à la pile. |
Mise en œuvre | Sa mise en œuvre est dur . | Sa mise en œuvre est facile . |
Ordre d'attribution | L'allocation de mémoire est continu . | Mémoire allouée dans aléatoire commande. |
Sécurité des fils | Il est thread-safe car chaque thread possède sa propre pile. | Il n'est pas thread-safe, une synchronisation correcte du code est donc requise. |