Qu'est-ce que l'allocation de mémoire en Java? Mémoire de pile et de tas

Cet article basé sur «Allocation de mémoire en Java» vous aidera avec une connaissance détaillée de l'allocation de mémoire ainsi que des structures de données Stack et Heap.

Allocation de mémoire est un processus par lequel des programmes et des services informatiques sont attribués avec des Mémoire espace. Dans cet article, nous allons découvrir l'allocation de mémoire dans et nous discuterons de Stack et Heap Memory.



Qu'est-ce que la mémoire de pile?

La mémoire Java Stack est utilisée pour l'exécution d'un thread. Ils contiennent des valeurs spécifiques à la méthode qui sont de courte durée et des références à d'autres objets du tas auxquels la méthode fait référence.



Empiler la mémoire est toujours référencée dans LIFO (dernier entré, premier sorti) ordre. Chaque fois qu'une méthode est appelée, un nouveau bloc est créé dans la mémoire de la pile pour que la méthode contienne les valeurs primitives locales et fait référence à d'autres objets de la méthode.

Dès que la méthode se termine, le bloc devient inutilisé et devient disponible pour la méthode suivante.



La taille de la mémoire de la pile est très inférieure à celle de la mémoire du tas.

comment définir le chemin java

Principales caractéristiques de la mémoire de pile

Outre ce dont nous avons discuté jusqu'à présent, voici quelques autres caractéristiques de Empiler Mémoire:

  • Il grandit et rétrécit au fur et à mesure que de nouvelles méthodes sont appelées et renvoyées respectivement
  • Les variables à l'intérieur de la pile n'existent que tant que la méthode qui les a créées est en cours d'exécution
  • Ses automatiquement alloué et désalloué lorsque la méthode termine l'exécution
  • Si cette mémoire est pleine, Java lance java.lang.StackOverFlowError
  • L'accès à cette mémoire est vite par rapport à la mémoire du tas
  • Cette mémoire est thread-safe car chaque thread fonctionne dans sa propre pile

Méthodes de la classe Stack

  • Objet push ( Élément objet ): Pousse un élément sur le dessus de la pile.
  • Objet pop (): Supprime et renvoie l'élément supérieur de la pile. Une «EmptyStackException» exception est levée si nous appelons pop () lorsque la pile appelante est vide.
  • Aperçu de l'objet (): Renvoie l'élément en haut de la pile, mais ne le supprime pas.
  • Booléen vide (): Il retourne true si rien ne se trouve en haut de la pile. Sinon, renvoie false.
  • recherche int ( Élément objet ): Il détermine si un objet existe dans la pile. Si l'élément est trouvé, il renvoie la position de l'élément à partir du haut de la pile . Sinon, il renvoie -1.

Code Java pour l'implémentation de la pile

import java.io. * import java.util. * class Test {static void stack_push (Stack stack) {for (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

//Production



memory-allocation-in-java

Maintenant, passons à Heap Space.

Heap Space à Java

La mémoire est allouée lors de l'exécution des instructions écrites par les programmeurs. Notez que le nom du tas n'a rien à voir avec la structure de données du tas. On l'appelle tas car c'est une pile d'espace mémoire disponible pour les programmeurs attribué et désallouer. Si un programmeur ne gère pas bien cette mémoire, une fuite de mémoire peut se produire dans le programme.

Principales caractéristiques de la mémoire Java Heap

  • Outre ce dont nous avons discuté jusqu'à présent, voici quelques autres caractéristiques de l'espace de tas:
  • Il est accessible via des techniques complexes de gestion de la mémoire qui incluent Jeune génération, vieux ou Génération titulaire, et Génération permanente
  • Si l'espace du tas est plein, Java lance java.lang.OutOfMemoryError
  • L'accès à cette mémoire est relativement plus lent que la mémoire de pile
  • Cette mémoire, contrairement à stack, n’est pas automatiquement désallouée. Il faut Éboueur libérer des objets inutilisés afin de conserver l'efficacité de l'utilisation de la mémoire
  • Contrairement à la pile, un tas n’est pas thread-safe et doit être protégé en synchronisant correctement le code

Différence entre l'espace de tas Java et la mémoire de pile

Sur la base des explications ci-dessus, nous pouvons facilement conclure les différences suivantes entre Tas et Empiler Mémoire.

  • Tas la mémoire est utilisée par toutes les parties de l'application alors que la mémoire de pile n'est utilisée que par un seul thread d'exécution.
  • Chaque fois qu’un objet est créé, il est toujours stocké dans l’espace du tas et la mémoire de la pile contient la référence à celui-ci. La mémoire de pile contient uniquement variables primitives locales et variables de référence aux objets dans l'espace du tas.
  • Les objets stockés dans le tas sont globalement accessibles, tandis que la mémoire de la pile n'est pas accessible par d'autres threads.
  • La gestion de la mémoire dans la pile se fait dans un LIFO alors qu’elle est plus complexe en mémoire Heap car elle est utilisée globalement. La mémoire du tas est divisée en Jeune génération, ancienne génération etc, plus de détails sur Java Garbage Collection.
  • La mémoire de pile est de courte durée alors que la mémoire du tas vit du début à la fin de l'exécution de l'application.
  • On peut utiliser -XMX et -XMS Option JVM pour définir la taille de démarrage et la taille maximale de la mémoire du tas. On peut utiliser -XSS pour définir la taille de la mémoire de la pile.
  • Lorsque la mémoire de la pile est pleine, le runtime Java lance java.lang.StackOverFlowError alors que si la mémoire du tas est pleine, il jette java.lang.OutOfMemoryError: Java heap spaceErreur.
  • La taille de la mémoire de la pile est très inférieure à celle de la mémoire du tas. En raison de la simplicité de l'allocation de mémoire (LIFO), la mémoire de pile est très rapide par rapport à mémoire de tas.

Tableau de comparaison

PARAMÈTRE EMPILER TAS
De base La mémoire est allouée dans un bloc contiguLa mémoire est allouée dans un ordre aléatoire
Allocation et désallocation Automatique par compilateurManuel par programmeur
Coût MoinsPlus
la mise en oeuvre DurFacile
Temps d'accès Plus viteRalentissez
Problème principal Pénurie de mémoireFragmentation de la mémoire
Localité de différence ExcellentAdéquat
La flexibilité Taux fixeLe redimensionnement est possible

Avec cela, nous arrivons à la fin de ce didacticiel «Allocation de mémoire en Java». J'espère que vous avez compris le concept et sa mise en œuvre à travers quelques exemples en temps réel.

Maintenant que tu as comprisAllocation de mémoire en Javales bases de cet article sur l’allocation de mémoire en Java par Edureka, une entreprise d'apprentissage en ligne de confiance avec un réseau de plus de 250 000 apprenants satisfaits répartis dans le monde entier. Les cours de formation et de certification Java J2EE et SOA d'Edureka sont conçus pour les étudiants et les professionnels qui souhaitent devenir développeur Java. Le cours est conçu pour vous donner une longueur d'avance dans la programmation Java et vous former aux concepts Java de base et avancés ainsi qu'à divers frameworks Java tels que Hibernate et Printemps .

qu'est-ce que l'abstraction en java avec exemple

Vous avez une question pour nous? Mentionnez-le dans la section commentaires de ce blog «Allocation de mémoire en Java» et nous vous répondrons dans les plus brefs délais.