Le contenu de cet article est de présenter la méthode d'allocation de mémoire de JVM. Elle a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Cet article explique comment l'allocation de mémoire est effectuée lorsqu'un programme Java est en cours d'exécution ?
Il existe trois types de stockage mémoire lorsque la machine virtuelle Java est compilée :
1, stockage statique (zone de méthode)
2, Stockage de type pile
3. Stockage en tas
Le stockage statique signifie que les besoins de stockage des données doivent être déterminés lors de la compilation, puis un montant fixe. de données doivent lui être allouées. De la mémoire, donc le stockage statique ne permet pas l'apparition de structures de données variables, car les données variables ne déterminent pas l'espace de stockage
Le stockage par pile est tout le contraire par rapport au stockage statique à la compilation. time, stack storage Les données de stockage spécifiées sont incertaines. On ne le saura que lorsque les données seront réellement exécutées. À ce moment-là, de l'espace mémoire pourra leur être alloué
Le stockage en tas est comparé au stockage en pile. est avant d'allouer de l'espace. Il est nécessaire de spécifier la quantité de mémoire à allouer aux données, mais le stockage en tas ne peut pas déterminer l'espace mémoire requis pour les structures de données, telles que les tableaux de variables et les instances d'objets, le tas est donc composé de grandes zones de blocs disponibles. et des blocs gratuits
Le stockage statique est relativement simple, nous nous concentrons donc sur l'analyse de la relation et de la différence entre la pile et le tas
Différence :
Une fois que les données de la pile dépassent leur portée, elles seront libérées et la mémoire sera occupée par d'autres données
Dans le tas, celles allouées. la mémoire est gérée par le garbage collector automatique de la machine virtuelle Java. Ces tableaux et objets Mutables deviendront des déchets lorsqu'aucune variable de référence ne pointe vers eux, mais ils occupent toujours de la mémoire et seront libérés par le garbage collector à un moment incertain
dans une instance JVM, il n'y a qu'une seule zone de tas et la pile peut avoir plusieurs
relations
Après avoir créé une donnée dans le tas, vous pouvez définir une variable dans la pile, qui pointe vers le tas Certaines données (pointant vers la première adresse des données), c'est-à-dire que cette variable devient une variable de référence pour les données dans le tas. Vous pouvez utiliser la variable de référence pour accéder au tas. données dans le tas. C'est le pointeur de Java.
Et chaque application Java aura une instance JVM, et chaque instance correspond à un tas. Lors du fonctionnement de cette application, toutes les instances de classe et tous les tableaux sont placés dans ce tas, et lors de la création d'un objet, la mémoire est allouée. à partir de deux endroits. Dans le tas, c'est la valeur réelle de l'objet, et dans la pile (pile, aussi appelée pile), l'index de l'objet dans le tas est alloué
Regardez d'abord cette image (enfin, elle est très vivante)
JVM est basé sur la pile Oui , à chaque fois qu'un nouveau thread est créé, une pile sera allouée. Elle est basée sur des frames et possède la fonctionnalité premier entré, dernier sorti (voir l'image pour comprendre)
Lorsqu'une méthode java est activée. , il est mis dans la pile. Un cadre (c'est Push sur la pile Lors de l'exécution de cette méthode, ce cadre sera utilisé pour sauvegarder les données de l'
la méthode est déterminée par la pile, et en raison de la forme premier entré, dernier sorti, plus les méthodes sont imbriquées profondément, plus il est difficile de libérer la mémoire de la pile, je ne recommande donc pas l'utilisation de méthodes récursives L'implémentation spécifique du stack push et du popping est publiée ci-dessousUtilisez le stack push et le pop pour inverser l'ordre des chaînesString value = "test 1234567890"; StringBuffer result = new StringBuffer(); Stack stack = new Stack(); for(char c : value.toCharArray()) { stack.push(c); } while (!stack.empty()) { result.append(stack.pop()); } value = result.toString();Tutoriels vidéo associés recommandés : "
Tutoriel Java"
Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun. Pour un contenu plus passionnant, vous pouvez prêter attention aux colonnes de didacticiels pertinentes du site Web PHP chinois ! ! !Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!