Maison  >  Article  >  Java  >  Explication détaillée des exemples de prototypes de mémoire de machine virtuelle Java

Explication détaillée des exemples de prototypes de mémoire de machine virtuelle Java

零下一度
零下一度original
2017-07-21 22:04:341227parcourir

Les six parties du prototype de mémoire de machine virtuelle Java :

1. Registre : nous n'avons aucun contrôle dans le programme

2. Pile : stocke les types de base de données et de références d'objets, mais L'objet lui-même n'est pas stocké sur la pile, mais est stocké dans le tas

3. Heap : stocke les données générées avec new

4. Domaine statique : stocké dans l'objet défini avec Membre statique

5. Pool de constantes : stocker les constantes

6. Stockage non RAM : espace de stockage permanent tel qu'un disque dur

Explication détaillée des exemples de prototypes de mémoire de machine virtuelle Java

Allocation mémoire Java La pile

L'unité de base de la pile est le frame (ou stack frame) : à chaque fois qu'un thread java s'exécute, la machine virtuelle java alloue une pile java au thread. Lorsque le thread exécute une certaine méthode Java, il pousse un cadre dans la pile Java. Ce cadre est utilisé pour stocker des paramètres, des variables locales, des opérandes, des résultats d'opérations intermédiaires, etc. Une fois l'exécution de cette méthode terminée, le cadre sera retiré de la pile. Lorsqu'une variable est définie dans un bloc de code, Java alloue de l'espace mémoire pour la variable sur la pile. Lorsque la variable quitte la portée, Java libère automatiquement l'espace mémoire alloué à la variable et l'espace mémoire peut être utilisé immédiatement. utilisé à d’autres fins. Mais lorsque nous opérons, nous devons faire attention aux points suivants :

1. Toutes les données de la pile Java sont privées et les autres threads ne peuvent pas accéder aux données de la pile de ce thread.

2. Tous les objets sont stockés et chaque objet contient des informations sur une classe correspondante (le but de la classe est d'obtenir des instructions d'opération

3. JVM n'a qu'une seule zone de tas (tas) ; ), et est partagé par tous les threads. Les types de base et les références d'objet ne sont pas stockés dans le tas, seuls l'objet lui-même et le tableau lui-même sont stockés

 栈的基本单位是帧(或栈帧):每当一个java线程运行的时候,java虚拟机会为该线程分配一个java栈。

Heap en Java ; allocation de mémoire

Le tas de la machine virtuelle Java est utilisé pour stocker les objets et les tableaux créés par new. La mémoire allouée dans le tas est gérée par le mécanisme automatique de garbage collection de la machine virtuelle Java.

Pour faire simple, par rapport à la pile, le tas est principalement utilisé pour stocker des objets Java, et la pile est principalement utilisée pour stocker des références d'objets... Après qu'un tableau ou un objet soit généré dans le tas, elle peut également être ajoutée à la pile Définir une variable spéciale dans la pile pour que la valeur de cette variable dans la pile soit égale à la première adresse du tableau ou de l'objet dans la mémoire tas. Cette variable dans la pile devient une variable de référence. du tableau ou de l'objet. Une variable de référence équivaut à donner un nom à un tableau ou un objet. Vous pouvez ensuite utiliser la variable de référence dans la pile pour accéder au tableau ou à l'objet dans le tas du programme. Une variable de référence équivaut à donner un nom à un tableau ou un objet.

Le tas de Java est une zone de données d'exécution, à partir de laquelle les objets de classe allouent de l'espace. Ces objets sont créés via des instructions telles que new, newaray, anewarray et multianewarray, et ils ne nécessitent pas que le code du programme soit explicitement publié. Il est responsable du garbage collection. L'avantage du tas est qu'il peut allouer dynamiquement la taille de la mémoire, et la durée de vie n'a pas besoin d'être indiquée au compilateur à l'avance, car il alloue dynamiquement la mémoire au moment de l'exécution, et le garbage collector de Java le fera automatiquement. collecter ces données réutilisées inutilisées. Mais l'inconvénient est qu'en raison de l'allocation dynamique de mémoire au moment de l'exécution, la vitesse d'accès est lente

Remarque : les objets créés ne contiennent que leurs propres variables membres et n'incluent pas les méthodes membres. . Étant donné que les objets de la même classe ont leurs propres variables membres et sont stockés dans leurs propres tas, mais qu'ils partagent les méthodes de la classe, les méthodes membres ne sont pas copiées à chaque fois qu'un objet est créé

Supplément : Comparaison Java. La raison de l'occupation de la mémoire

Les variables de référence sont des variables ordinaires, qui sont allouées sur la pile lorsqu'elles sont définies. Les variables de référence sont libérées après l'exécution du programme en dehors de leur portée, tandis que les tableaux et les objets eux-mêmes. sont alloués sur le tas lorsque le programme s'exécute en dehors du bloc de code où se trouve l'instruction utilisant new pour générer un tableau ou un objet, la mémoire occupée par le tableau et l'objet lui-même ne sera pas libérée. Les tableaux et les objets ne deviendront des déchets que lorsqu'ils s'y trouveront. Il n'y a pas de variables de référence pointant vers eux, et ne peut pas être réutilisé, mais occupant toujours de l'espace mémoire, il sera collecté (libéré) par le garbage collector à un moment incertain. C'est aussi la raison pour laquelle Java occupe plus de mémoire.

En fait, en Java. Le pointeur fait référence à la variable dans la pile pointant vers la variable dans la mémoire du tas L'avantage de la pile est que la vitesse d'accès est plus rapide que celle du tas, juste derrière le tas ! s'inscrire, mais l'inconvénient est que les données de la pile peuvent être partagées. La taille et la durée de vie des données doivent être déterminées et manquent de flexibilité. La pile stocke principalement certains types de données variables de base (int, short, long, byte, float, double, boolean). , char) et les handles d'objet (références). 🎜>

Une particularité très importante de la pile est que les données stockées dans la pile peuvent être partagées. Supposons que nous définissions également :

inta=3;

intb=3;

Le compilateur traite d'abord inta=3 ; il crée d'abord une référence à la variable a sur la pile, puis vérifie s'il y a une valeur de 3 sur la pile. Si elle n'est pas trouvée, il stocke 3 dans, puis pointe. un à 3. . Puis traitez intb=3; après avoir créé la variable de référence de b, puisqu'il y a déjà une valeur de 3 sur la pile, b sera pointé directement vers 3. De cette façon, il existe une situation où a et b pointent tous deux vers 3 en même temps.

À ce moment-là, si a=4 est à nouveau défini ; alors le compilateur recherchera à nouveau s'il y a une valeur 4 dans la pile. Sinon, il stockera 4 et fera un point sur 4 ; s'il existe déjà, pointez directement a vers cette adresse. Par conséquent, les changements dans la valeur de a n’affecteront pas la valeur de b.

Il est à noter que ce type de partage de données est différent du partage des références de deux objets pointant vers un objet en même temps, car dans ce cas la modification de a n'affectera pas b, c'est déterminé par le compilateur Complete, il permet d'économiser de l'espace. Si une variable de référence d'objet modifie l'état interne de l'objet, cela affectera une autre variable de référence d'objet.

 Pool constant (constantpool)

Explication détaillée des exemples de prototypes de mémoire de machine virtuelle Java

  Le pool constant fait référence à certaines ressources qui sont déterminées lors de la compilation et enregistrées dans les données du fichier .class compilé. En plus des valeurs constantes (finales) de divers types de base (tels que int, long, etc.) et types d'objets (tels que String et tableaux) définis dans le code, il contient également quelques références de symboles sous forme de texte, tels que :

 1. Noms complets des classes et des interfaces

 2. Noms et descripteurs des champs

 3. Méthodes, noms et descripteurs.

La machine virtuelle doit maintenir un pool constant pour chaque type chargé. Pour les constantes String, leurs valeurs se trouvent dans le pool de constantes. Le pool de constantes est un ensemble ordonné de constantes utilisées par ce type, y compris des constantes directes (constantes de chaîne, entières et à virgule flottante) et des références symboliques à d'autres types, champs et méthodes. Le pool de constantes dans la JVM existe sous la forme d'une table en mémoire. Pour le type String, il existe une table CONSTANT_String_info de longueur fixe utilisée pour stocker les valeurs de chaîne littérale. Remarque : Cette table stocke uniquement les valeurs de chaîne littérale, pas les symboles. .

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn