Lorsqu'une personne commence à apprendre Java ou d'autres langages de programmation, elle entre en contact avec le tas et la pile. Comme il n'y a pas d'explication claire et claire au début, beaucoup de gens se poseront beaucoup de questions. qu'est-ce que la pile, et quelle est la différence entre le tas et la pile ? Ce qui est pire, c'est qu'il existe une pile en Java, une structure de données séquentielle dernier entré, premier sorti (dernier entré, premier sorti), qui est java.util.Stack. Dans ce cas, cela rendra inévitablement beaucoup de gens plus confus quant à la question précédente. En fait, le tas et la pile sont tous deux des parties de la mémoire et ont des fonctions différentes, et un programme doit allouer de la mémoire dans cette zone. Comme nous le savons tous, tous les programmes Java s'exécutent dans la machine virtuelle JVM. Ce que nous introduisons ici est naturellement le tas et la pile dans la mémoire (virtuelle) JVM.
la différence
La différence entre le tas et la pile en Java est naturellement une question courante dans les entretiens. Les points suivants sont les différences spécifiques.
Chacun remplit ses fonctions
La principale différence est que la mémoire de pile est utilisée pour stocker les variables locales et les appels de méthode.
La mémoire tas est utilisée pour stocker des objets en Java. Qu'il s'agisse de variables membres, de variables locales ou de variables de classe, les objets vers lesquels elles pointent sont stockés dans la mémoire tas.
Exclusif ou partagé
La mémoire de pile appartient à un seul thread.Chaque thread aura une mémoire de pile, et les variables qu'il stocke ne peuvent être visibles que dans le thread auquel il appartient.C'est-à-dire que la mémoire de pile peut être comprise comme la mémoire privée du thread.
Les objets dans la mémoire tas sont visibles par tous les threads. Les objets dans la mémoire tas sont accessibles par tous les threads.
Erreur d'exception
S'il n'y a pas d'espace disponible dans la mémoire de la pile pour stocker les appels de méthode et les variables locales, la JVM lancera java.lang.StackOverFlowError.
Et s'il n'y a pas d'espace disponible dans la mémoire tas pour stocker l'objet généré, la JVM lancera java.lang.OutOfMemoryError.
Taille de l'espace
La mémoire de la pile est beaucoup plus petite que la mémoire du tas. Si vous utilisez la récursion, votre pile se remplira rapidement. Si la récursion n'éclate pas à temps, un problème StackOverFlowError est susceptible de se produire.
Vous pouvez définir la taille de la mémoire de la pile avec l'option -Xss. L'option -Xms définit la taille de départ du tas et l'option -Xmx définit la taille maximale du tas.
C'est la différence entre le tas et la pile en Java. Si vous comprenez bien ce problème, cela peut vous aider à résoudre des problèmes de développement, à analyser l'utilisation de la mémoire de tas et de la mémoire de pile, et même à effectuer des réglages de performances.
Afficher la valeur par défaut (mis à jour)
Pour afficher la valeur par défaut du tas, utilisez le code suivant, où InitialHeapSize est la taille du tas initial et MaxHeapSize est la valeur maximale du tas.
Copiez le code comme suit :
13:17 $ java -XX:+PrintFlagsFinal -version |
uintx ErgoHeapSizeLimit = 0 {produit}
uintx HeapSizePerGCThread = 87241520 {produit}
uintx InitialHeapSize := 134217728 {produit}
uintx LargePageHeapSizeThreshold = 134217728 {produit}
uintx MaxHeapSize := 2147483648 {produit}
version java "1.8.0_25"
Environnement d'exécution Java(TM) SE (build 1.8.0_25-b17)
Machine virtuelle de serveur Java HotSpot(TM) 64 bits (build 25.25-b02, mode mixte)
Vérifiez la valeur par défaut de la pile, où ThreadStackSize est la taille de la mémoire de la pile.
Copiez le code comme suit :
13:21 $ java -XX:+PrintFlagsFinal -version grep ThreadStackSize
intx CompilerThreadStackSize = 0 {produit pd}
intx ThreadStackSize = 1024 {produit pd}
intx VMThreadStackSize = 1024 {produit pd}
version java "1.8.0_25"
Environnement d'exécution Java(TM) SE (build 1.8.0_25-b17)
Machine virtuelle de serveur Java HotSpot(TM) 64 bits (build 25.25-b02, mode mixte)
Informations sur la traduction
Texte original en anglais : http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
La traduction a été modifiée, organisée et supprimée sur la base du texte original. Si vous êtes intéressé, vous pouvez visiter le texte original. L'adresse PS a été bloquée.