Introduction
La gestion de la mémoire a toujours été la fierté et la fierté du langage JAVA. Elle permet aux programmeurs JAVA d'ignorer complètement les détails liés à la gestion de la mémoire et de se concentrer uniquement sur la logique métier. Cependant, aucune bonne chose n’est parfaite au monde. Même si cela apporte de la commodité, cela introduit également de nombreux problèmes de débordement et de fuite de mémoire.
Ce qui fait peur, ce n'est pas seulement cela. Certains programmeurs qui utilisent d'autres langages pour développer ont qualifié les programmeurs JAVA d'« ignorants de la mémoire », ce qui est vraiment inacceptable. Après tout, il n'y a pas de malloc et de suppression, pas de destructeurs et pas de pointeurs en JAVA. Comment les programmeurs qui débutent avec JAVA peuvent-ils entrer en contact avec la partie mémoire ? moines à mi-chemin.
Cependant, même si le fait est difficile à accepter, il existe effectivement de nombreux programmeurs JAVA qui ne connaissent rien à la mémoire. Bien que la maîtrise des connaissances pertinentes en matière de mémoire n'apporte peut-être pas de changements et d'avantages bouleversants au développement quotidien, elle le sera quand même. améliorez subtilement votre niveau technique.Après avoir compris la gestion de la mémoire, je pense que vous en aurez une compréhension approfondie.
Division mémoire
Quand on parle du mot mémoire, il s'agit d'une zone de stockage de données qui n'existe que lorsque le programme est en cours d'exécution. Quant à la division de cette zone, chaque machine virtuelle a la sienne. propre méthode de division, mais ils doivent être conformes aux spécifications de base de la machine virtuelle JAVA à implémenter.
Dans la spécification de la machine virtuelle, la mémoire est divisée en six parties, à savoir les registres PC, la pile de machine virtuelle JAVA, le tas JAVA, la zone de méthode, le pool de constantes d'exécution et la pile de méthodes locale.
Spécification de la machine virtuelle JAVA et machine virtuelle JAVA
Ici, nous devons également expliquer la différence entre la spécification de la machine virtuelle JAVA et la machine virtuelle JAVA. Comme son nom l'indique, la spécification de la machine virtuelle JAVA. est une implémentation de la machine virtuelle JAVA.Les exigences de spécification sont formulées par Oracle, et la machine virtuelle JAVA à laquelle nous faisons habituellement référence fait généralement référence à l'implémentation d'une spécification de machine virtuelle JAVA spécifique. Par exemple, le point d'accès de machine virtuelle JAVA le plus couramment utilisé. En fait, il existe de nombreuses implémentations de machine virtuelle JAVA. Même si vous avez une compréhension approfondie des spécifications de la machine virtuelle JAVA et que vous y êtes intéressé, vous pouvez écrire la vôtre. Machine virtuelle JAVA Bien sûr, la difficulté n'est pas difficile à imaginer.
Schéma structurel
L'image suivante est un diagramme de structure JVM cité de la bibliothèque Baidu Étant donné que le pool de constantes d'exécution est une zone allouée par la zone de méthode, il n'y a pas de constante d'exécution dans cette image. Bassin de mesure.
Explication détaillée de la zone mémoire
Pour l'image ci-dessus, la mémoire fait référence à la zone de données d'exécution dans la case rectangulaire. Voici une brève introduction aux fonctions de chaque partie :
1. Registre PC (thread Unique) : Le nom complet est le registre du compteur de programme, qui enregistre l'adresse de la méthode JAVA actuellement exécutée par chaque thread. Si une méthode locale est actuellement exécutée, le compteur de programme sera une adresse vide. Sa fonction est de prendre en charge le multithreading et une série d'opérations telles que le blocage, la récupération et la suspension des threads. Imaginez intuitivement comment récupérer si vous ne vous souvenez pas de la position d'exécution actuelle de chaque thread. Sur cette base, chaque thread possède un registre PC, ce qui signifie que le registre PC est unique au thread.
2. Pile de machines virtuelles JAVA (unique aux threads) : La pile de machines virtuelles JAVA est créée lorsqu'un thread est créé et est utilisée pour stocker les cadres de pile. La pile de machines virtuelles JAVA est également unique aux threads.
Cadre de pile : en termes simples, il peut être interprété comme une zone de stockage de données temporaires lorsqu'une méthode est en cours d'exécution. Plus précisément, il inclut des données et une partie des résultats du processus. est également responsable de la gestion des valeurs de retour des méthodes, des liaisons dynamiques et de la répartition des exceptions. Le cadre de pile est créé lors de la création de la méthode et détruit à la fin de la méthode. Si la méthode lève une exception, elle est également considérée comme la fin de la méthode. Cependant, dans chaque cadre de pile, il existe sa propre table de variables locales et sa propre pile d'opérandes, ainsi qu'une référence au pool de constantes d'exécution de la classe actuelle.
Tableau des variables locales : il s'agit d'une liste de variables locales de méthode, qui est écrite dans le fichier de classe lors de la compilation. Pour une compréhension simple, il peut être compris comme un tableau d'objets, qui correspond à chaque variable locale selon l'index 0 à longueur-1. En particulier, s'il s'agit de la table de variables locales de la méthode d'instance, la 0ème variable locale sera. être une référence A à l'instance actuelle, qui est le mot-clé this, et le reste des variables locales commencent à l'index 1.
Pile d'opérandes : il s'agit d'une pile dernier entré, premier sorti (LIFO), et sa longueur est également écrite dans le fichier de classe lors de la compilation et est corrigée. Sa fonction est de fournir de l'espace pour le calcul des variables d'opération d'instruction de bytecode. Par exemple, pour la phrase simple int a=9, vous devez d'abord insérer 9 dans la pile d'opérandes, puis attribuer 9 à la variable a.
3. Tas JAVA (partagé globalement) : Cette partie est la partie la plus importante de la mémoire JAVA. La raison pour laquelle elle est la partie la plus importante n'est pas à cause de son importance, mais à cause de la partie la plus importante en tant que partie. une partie développeur à laquelle il faut prêter attention. Il est créé au démarrage de la machine virtuelle JAVA, stocke toutes les instances d'objets et objets de tableau et dispose d'un « système de gestion automatique de la mémoire » intégré, que nous appelons souvent le garbage collector (GC). La libération de mémoire dans le tas JAVA n'est pas contrôlée par le développeur et est entièrement gérée par la machine virtuelle JAVA. La spécification de la machine virtuelle JAVA n'a pas de réglementation claire sur la façon d'implémenter un garbage collector dans une machine virtuelle JAVA. Pour cette raison, la machine virtuelle JAVA que nous utilisons habituellement fournit de nombreux types de garbage collector, qui utilisent différents algorithmes et méthodes d'implémentation. divers besoins de performances.
4. Zone de méthode (partage global) : La zone de méthode est également un composant du tas. Elle stocke principalement le pool de constantes d'exécution, les informations de champ, les informations de méthode, le contenu du bytecode des constructeurs et des fonctions ordinaires, ainsi que certaines fonctions spéciales. méthode. La plus grande différence entre celui-ci et le tas JAVA est que les informations stockées sont différentes de celles du tas JAVA. La plus grande différence est que cette partie de la spécification de la machine virtuelle JAVA n'exige pas la mise en œuvre d'un système de gestion automatique de la mémoire (GC).
5. Pile de méthodes natives (unique aux threads) : La pile de méthodes locales est une pile traditionnelle utilisée pour prendre en charge l'exécution de méthodes natives. Si la machine virtuelle JAVA utilise d'autres langages pour implémenter l'interpréteur de jeu d'instructions, la pile de méthodes native sera également utilisée. Si aucun des deux cas précédents ne se produit, c'est-à-dire si la machine virtuelle JAVA ne s'appuie pas sur la pile de méthodes natives et que la machine virtuelle JAVA ne prend pas en charge les méthodes natives, la pile de méthodes natives n'est pas nécessaire. Si nécessaire, la pile de méthodes locale est également créée au démarrage de chaque thread.
À l'exception du registre PC, les quatre autres zones de mémoire ci-dessus nécessitent généralement l'implémentation de la machine virtuelle JAVA pour fournir aux clients des paramètres d'ajustement de taille, qui sont nos Xms, Xmx, etc. couramment utilisés.
Gestion de la mémoire
La gestion de la mémoire est divisée en allocation de mémoire et libération de mémoire. Jetez un œil aux cinq zones de mémoire ci-dessus. En fait, elle peut être grossièrement divisée en deux parties, l'une étant globale. partagé et l’autre est indépendant du thread.
Cette partie de la mémoire propre au thread est créée au démarrage du thread, et lorsque le thread est détruit, la mémoire est libérée. Cette partie de la mémoire n'a pas besoin d'être gérée par le garbage collector, mais est activement gérée par la machine virtuelle JAVA Chaque fois qu'un thread est créé, la machine virtuelle JAVA lui allouera le registre PC correspondant et la pile de machine virtuelle JAVA. nécessaire Si tel est le cas, il y aura également une pile de méthodes locale. De manière correspondante, lorsqu'un thread est détruit, la machine virtuelle JAVA libère également toute la mémoire occupée par ce thread.
Par rapport à la partie de mémoire propre aux threads, la partie de mémoire globalement partagée est plus difficile à gérer, mais ceci concerne uniquement l'implémentation de machines virtuelles, car cette partie de mémoire est nécessaire pour implémenter le système de gestion automatique de la mémoire. (GC) .
L'allocation de mémoire pour cette partie de la mémoire globalement partagée (ci-après appelée le tas) est principalement déclenchée par l'utilisation explicite par le programmeur du mot-clé new. Quant à savoir où et comment allouer cette partie de la nouvelle mémoire, cela est décidé par le virtuel JAVA. machine. . La libération de cette partie de mémoire est gérée par le système de gestion automatique de la mémoire (ci-après dénommé GC).
Normalement, l'allocation de mémoire du tas dépend de la stratégie et de la mise en œuvre du GC. Lors de l'allocation, vous devez réfléchir à la manière de récupérer cette partie de la mémoire. Pour cette raison, pour expliquer l’allocation de mémoire, nous devons d’abord comprendre comment la mémoire est recyclée afin de mieux comprendre comment la mémoire est allouée.
Conclusion
Ce qui précède est le contenu de la gestion de la mémoire JVM------Présentation de la gestion de la mémoire du langage JAVA Pour plus de contenu connexe, veuillez prêter attention à la. Site Web PHP chinois (www .php.cn) !