La différence entre la mémoire Heap et la mémoire Stack dans la JVM

Share:
Heap Stack JVM Java
L'un des nombreux traits d'un bon programmeur est à quel point il comprend le fondamental. Et si vous voulez vérifier les principes fondamentaux, il suffit de demander la différence entre la Heap et la mémoire Stack. Même si les deux font partie de la mémoire JVM et sont deux mémoires allouées au processus Java, il existe de nombreuses différences entre elles.
La mémoire Heap est partagée par tous les threads de l'application Java, mais la mémoire Stack est locale pour chaque thread. Les objets sont créés dans la mémoire Heap, mais les scopes des méthodes sont stockés dans la mémoire Stack, et la taille de l'espace du Heap est beaucoup plus grande que la petite taille de Stack en Java. Si vous connaissez autant d'informations sur les mémoire Heap et Stack dans Java, vous êtes l'un des meilleurs candidats, mais voyons plus de détails pour impressionner l'interviewer.

Stack vs Heap dans Java

Comme je l'ai dit, les espaces Stack et Heap font tous les deux partie de la JVM mais ils sont utilisés à d'autres fins, voyons d'autres points pour mieux comprendre la différence entre les deux mémoires.


1) Taille
L'une des différences significatives entre la Stack et la Heap provient de leur taille. L'espace de la Heap dans Java est beaucoup plus grand que la mémoire Stack. Cela est en partie dû au fait que chaque fois qu'un nouveau thread est créé dans JVM, une mémoire de la Stack distincte leur est allouée.

2) Redimensionnement
La JVM vous permet de redimensionner à la fois la Heap et la Stack dans Java, mais vous devez utiliser les différents "flags" JVM pour cela. Vous pouvez utiliser -Xms et -Xmx pour spécifier la mémoire de Heap initiale et maximale dans Java. De même, vous pouvez utiliser -Xss pour spécifier la taille de la Stack des threads individuels dans la JVM. 

3) Utilisation
Une autre différence significative provient de leur perspective d'utilisation. La mémoire Heap est utilisée pour stocker des objets en Java. Peu importe où vous créez l'objet, par ex. à l'intérieur d'une méthode, d'une classe ou d'un bloc de code, ils sont toujours créés dans l'espace de la Heap et la mémoire est allouée à partir de cette dernière.

Une petite exception est les littéraux String qui vivent dans String pool, qui ne faisait pas partie de Java 7. Le pool String antérieur été créé sur l'espace meta, qui était distinct de la mémoire JVM utilisée pour stocker les métadonnées de classe, mais à partir de JDK 7, le pool des String est fusionné dans l'espace du Heap.

D'autre part, la mémoire Stack est utilisée pour stocker des variables locales, par ex. variables int et booléenne primitives, scope de méthode et la pile d'appels.

4) Visibilité
Une autre différence vient des perspectives de visibilité et de partage. La mémoire Heap est partagée par tous les threads donc elle est également connue comme la mémoire principale mais la mémoire Stack est locale aux threads et la variable locale créée là n'était pas visible aux autres. Les threads peuvent également mettre en cache des valeurs dans la mémoire Stack. 

5) Ordre
La Heap est une zone de mémoire importante dans laquelle les objets peuvent être créés et stockés dans n'importe quel ordre, mais la mémoire Stack est structurée en tant que structure de données Pile, c'est-à-dire LIFO, où les appels de méthode sont stockés en dernier. C'est pourquoi vous pouvez utiliser la récursivité en Java.


6) Erreur
Vous obtenez différentes erreurs lorsque la mémoire Heap ou la Stack est remplie. Par exemple, un algorithme récursif défectueux peut rapidement remplir la mémoire Stack avec des appels de méthode récursifs. Dans ce cas, vous verrez java.lang.StackOverFlowError, mais quand il n'y a plus d'espace dans la Heap pour allouer un nouvel objet, vous verrez le OutOfMemoryError dans Java par exemple java.lang.OutOfMemoryError: Java Heap Space. C'est une autre différence utile à savoir entre Stack et Heap dans Java du point de vue du débogage et du dépannage.


C'est tout sur la différence entre la pile et la mémoire Heap dans l'application Java. Il est extrêmement important pour tout développeur Java, junior ou expérimenté, de connaître ces principes fondamentaux. Si vous ne connaissez pas la Heap, il serait très difficile de passer des entretiens de programmation Java. Rappelez-vous que la mémoire Stack est utilisée pour stocker les variables locales et les appels de méthodes tandis que la mémoire Heap est utilisée pour stocker des objets, la mémoire Heap est beaucoup plus grande que la mémoire Stack mais l'accès à cette dernière est plus rapide que la première.

Aucun commentaire