Nous savons qu'en langage C++, si vous souhaitez utiliser un objet, vous devez effectuer une nouvelle opération sur celui-ci ; si vous n'utilisez plus l'objet, vous devez effectuer une opération de suppression sur celui-ci. Une fois que le développeur oublie d’écrire l’instruction de suppression, cela provoquera une fuite de mémoire. [Si la mémoire est occupée par un objet et n'est pas restituée, cela s'appelle une fuite de mémoire. 】
Mais Java est intelligent. Il est passé de « manuel » à « automatique » et a confié le contrôle de la mémoire à la machine virtuelle. Jetons un coup d'œil à la façon dont jvm effectue la gestion automatique de la mémoire.
La gestion automatique de la mémoire est divisée en deux parties :
Allocation de mémoire aux objets et récupération de la mémoire allouée aux objets. Dans cet article, nous parlons du premier, à savoir le partitionnement de la mémoire et l'allocation de mémoire. Parlons du GC (garbage collection) dans le prochain article.
1. Division de la mémoire
Jetons un coup d'œil à ce qu'il y a dans la mémoire de la machine virtuelle. La zone mémoire de la JVM est grossièrement divisée en fichiers de classe, sous-système de chargement de classe, zone de données d'exécution et moteur d'exécution. Aujourd'hui, nous ne parlons que de la zone des données d'exécution. [Cette image est basée sur JDK7. Avant JDK7, le pool de constantes était stocké dans la zone de méthode. Depuis JDK7, le pool constant a été placé sur le tas. 】
Thread public
Dans la zone de données d'exécution, la zone de méthode et le tas sont publics pour le thread, c'est-à-dire cette Les deux zones sont "recyclées", elles doivent donc être collectées. Il est créé au démarrage de la machine virtuelle.
Thread privé
La pile de machine virtuelle, la pile de méthodes locales et le compteur de programme sont privés du thread. Ils "vivent et meurent" avec le thread et sont ". unique", il n'est donc pas nécessaire de le récupérer.
(1) La zone de méthode
stocke les informations de classe, les constantes, les variables statiques, le code compilé par le compilateur juste à temps et d'autres données qui ont été chargé par la machine virtuelle.
Il existe un pool de constantes d'exécution. Il stocke les références de symboles décrites dans le fichier Class, références directes. De nouvelles constantes peuvent être placées dans ce pool à la fois au moment de la compilation et au moment de l'exécution.
(2) Tas
Concept : Si la pile résout le problème du fonctionnement du programme, c'est-à-dire comment le programme traite les données alors ; le tas résout C'est un problème de stockage de données, c'est-à-dire comment et où placer les données.
Caractéristiques :
a. Le tas est la plus grande partie de la mémoire de la machine virtuelle, représentant environ les trois quarts de la mémoire. Par exemple, si chaque processus sur une plate-forme Windows 32 bits dispose de 2 Go de mémoire, 1,5 Go de mémoire sont généralement alloués au tas. On voit que le tas prend beaucoup de place.
b. Il peut être dans un espace mémoire physiquement discontinu, à condition qu'il soit logiquement continu.
Fonction :
Instances d'objets de stockage, presque toutes les instances d'objets allouent de la mémoire ici.
Classification :
Du point de vue du recyclage de la mémoire, elle est divisée en la nouvelle génération et l'ancienne génération.
Du point de vue de l'allocation de mémoire, plusieurs tampons d'allocation privés de thread peuvent être divisés.
(3) Pile de machines virtuelles
La pile de machines virtuelles stocke les cadres de pile, et les cadres de pile stockent les tables de variables locales, lien dynamique, sortie de méthode et autres informations.
Cadre de pile dans la pile
Chaque méthode créera un cadre de pile et une méthode lors de l'exécution du processus de l'appel jusqu'à la fin de l'exécution correspond au processus allant de l'insertion d'un cadre de pile dans la pile de la machine virtuelle jusqu'à son extraction.
La table de variables locales dans le cadre de pile
stocke divers types de données de base, références d'objet et types returnAddress connus au moment de la compilation. Par conséquent, l'espace mémoire requis peut être alloué lors de la compilation et sa taille ne changera pas pendant l'exécution.
Lors de l'allocation de l'espace occupé par les types de données de base, à l'exception des données de 64 bits de long et de type double, qui occuperont deux espaces de variables locales, les autres types de données n'en occuperont qu'un.
(4) Pile de méthodes locales
Les fonctions de la pile de méthodes locales et de la pile de machines virtuelles sont les mêmes, sauf que la pile de machines virtuelles exécute méthodes java, la pile de méthodes natives exécute la méthode Native.
La méthode Java est le code Java écrit par le développeur, et la méthode native est une interface permettant à Java d'appeler du code non Java.
(5) Compteur de programme
Le compteur de programme stocke le numéro de ligne du bytecode exécuté par le thread actuel. Lorsque le jvm fonctionne, il sélectionne la prochaine instruction de bytecode qui doit être exécutée en modifiant la valeur de ce compteur.
2. Allocation de mémoire
Dans cette partie, nous parlons de la façon dont les objets sont alloués, disposés et accessibles dans le tas Java. . Et les principes d'allocation de mémoire.
Création d'objets
Nous utilisons new pour créer des objets. Voyons ce que fait la machine virtuelle lorsque le système s'exécute. nouveau . À l’heure actuelle, les humains sont comme un morceau de viande. Ils doivent passer par plusieurs niveaux de contrôles de sécurité avant de pouvoir atteindre la table des humains. Étape 1 : Vérifiez s’il existe une référence de symbole correspondante dans le pool de constantes. [Procédez dans la zone méthode]
Étape 2 : Vérifiez si cette classe a été chargée, analysée et initialisée. [Procédez dans la zone méthode]
Etape 3 : Recevez la mémoire du nouvel objet. Il existe deux manières : collision de pointeur et liste libre. [Traité dans le tas]
Étape 4 : Initialisez l'espace mémoire alloué à la valeur zéro.
Étape 5 : Effectuez les paramètres nécessaires pour l'objet, tels que la classe dont il est une instance, le code de hachage de l'objet, etc. Ces informations sont stockées dans l'en-tête de l'objet
Étape 6 : Si l'objet se voit attribuer une valeur initiale dans le code Java, l'étape 6 sera effectuée : Exécutez la méthode
Disposition de la mémoire de l'objet
La disposition de stockage de l'objet dans la mémoire est divisé en 3 parties : en-tête d'objet + données d'instance + remplissage d'alignement
En-tête d'objet
Il y a deux parties d'informations dans l'en-tête d'objet :
(1) Données d'exécution, y compris le code de hachage, l'âge de génération du GC, l'indicateur d'état de verrouillage, etc.
(2) Tapez pointeur, la machine virtuelle utilise ce pointeur pour déterminer de quelle classe cet objet est une instance.
Données d'instance
Les données d'instance stockent le contenu de différents types de champs définis dans le code.
Remplissage aligné
Le remplissage aligné sert d'espace réservé et n'est pas nécessairement là. Il suffit de s'assurer que la taille de l'objet est un multiple entier de 8 octets.
Emplacement d'accès aux objets
Après avoir créé l'objet, nous pouvons utiliser l'objet. En l’utilisant, comment trouver l’objet que vous recherchez ? Il existe deux manières : gérer et pointer direct
Handle :
L'accès au handle consiste à diviser un morceau de mémoire dans Java tas En tant que pool de handles, le handle contient les informations d'adresse spécifiques des données d'instance d'objet et des données de type.
Pointeur direct :
La raison pour laquelle le pointeur direct est "direct " C'est parce qu'il supprime l'intermédiaire du manche. C'est donc plus rapide que de manipuler. Dans la machine virtuelle HotSpot, cette méthode est utilisée.
Après avoir parlé de la manière dont les objets sont alloués, disposés et accessibles dans le tas Java, parlons des principes d'allocation de mémoire. d'allocation de mémoire :
Le tas est grossièrement divisé en nouvelle génération, l'ancienne génération et la génération permanente. L'allocation mémoire des objets est principalement allouée dans la zone Eden de la nouvelle génération, et dans quelques cas, elle est allouée directement à l'ancienne génération. Les règles d'allocation ne sont pas fixes à 100 % et dépendent de la combinaison du garbage collector et des paramètres définis. Il existe plusieurs principes d’allocation à titre de référence ci-dessous. (1) Les objets sont d'abord alloués dans Eden.
(2) Les gros objets entrent directement dans la vieillesse.
(3) Les objets survivant à long terme entreront dans l'ancienne génération.
(4) Détermination dynamique de l'âge des objets.
(5) Garantie d'attribution d'espace.
Ce qui précède est la division de la mémoire dans la machine virtuelle JAVA. Pour plus de questions, veuillez visiter le site Web PHP chinois :
Tutoriel vidéo JAVA.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!