Préface
La zone de mémoire Java est principalement composée de compteurs de programmes, de piles de machines virtuelles Java, de piles de méthodes locales, de tas Java, de zones de méthode et de pools constants d'exécution. Cet article vous présentera en détail la division et les exceptions des zones de mémoire Java. Je ne dirai pas beaucoup ci-dessous, jetons un coup d'œil à l'introduction détaillée ensemble.
Zone de données d'exécution
Lorsque le JVM gère des programmes Java, il divise la mémoire en plusieurs domaines de données différents.
Comptoir du programme
Fil privé. Il peut être considéré comme un indicateur de numéro de ligne du bytecode exécuté par le thread actuel. Le travail de l'interpréteur Bytecode est de lire l'instruction Bytecode suivante à exécuter en modifiant cette valeur de comptage.
Le multithreading est réalisé en changeant de threads à son tour et en allouant le temps d'exécution du processeur. À tout moment, un noyau ne peut exécuter que des instructions dans un seul thread. Afin de restaurer la position d'exécution correcte après la commutation de thread, chaque thread a besoin d'un compteur de programme indépendant. C'est ce que j'ai mentionné au début de "Thread Private". Si la méthode que le thread exécute est une méthode Java, le compteur enregistre l'adresse d'instructions du bytecode de machine virtuelle; S'il s'agit d'une méthode native, la valeur de compteur est vide. Le compteur de programme est le seul domaine où aucune situation OOM (outofMemoryError) n'est spécifiée dans la spécification de la machine virtuelle Java.
Pile de machine virtuelle Java
Les fils sont privés, avec le même cycle de vie que les fils. La pile de machines virtuelles Java décrit le modèle de mémoire des méthodes Java: chaque méthode créera une trame de pile lors de son exécution, stockant des tables de variables locales, des piles d'opérande, des liens dynamiques et des informations de sortie de la méthode. De l'appel à la fin, chaque méthode correspond au processus d'entrée et de sortie de la pile de ce cadre de pile dans la pile de machine virtuelle. Le tableau des variables locales enregistre divers types de données de base (int, double, char, octet, etc.), référence d'objet (pas l'objet lui-même) et le type de returnAddress (pointant vers une adresse bytecode).
Deux exceptions possibles dans ce domaine:
Pile de méthode locale
La pile de machines virtuelles ci-dessus exécute les services de méthode Java pour le JVM et la méthode locale exécute le service natif. D'autres sont similaires à la pile de machines virtuelles, et Stackoverflowerror et OutOfMemoryError seront également lancés.
Tas de java
COMMENT appelé «mémoire de pile» et «mémoire du tas», le premier se réfère à la pile de machine virtuelle, et le second se réfère au tas Java. Le tas Java est partagé par les fils. Créé lorsque la machine virtuelle démarre.
Le rôle du tas Java est de stocker des instances d'objets. Le tas Java peut être dans un espace mémoire physiquement discontinu et ne nécessite que logiquement continu.
Zone de méthode
La zone partagée par les fils. Stocke des données telles que les informations de classe, les constantes, les variables statiques, le code compilé par le compilateur, etc. qui ont été chargés par la machine virtuelle. Lorsque le domaine de la méthode ne peut pas répondre aux exigences d'allocation de mémoire, une oreilleurror outofmory est lancée.
Pool de runtime constant
Le pool constant d'exécution fait partie de la zone de méthode. C est utilisé pour stocker diverses constantes littérales et références symboliques générées pendant la période de compilation, et sera stockée dans le pool constant d'exécution qui entre dans la zone de méthode après le chargement de la classe. La langue Java ne nécessite pas de constantes pour être générées uniquement pendant la période de compilation. En d'autres termes, de nouvelles constantes peuvent être placées pendant la période d'exécution.
Mémoire directe
La mémoire directe ne fait pas partie de la zone de données d'exécution de la machine virtuelle, ni une zone de mémoire. L'allocation de la mémoire directe de la machine native ne sera pas limitée par la taille du tas Java, mais c'est la mémoire après tout. Si la somme de chaque zone de mémoire est supérieure à la limite de mémoire physique, une oreilleurror outofmory apparaîtra toujours.
Processus de création d'objets
La machine virtuelle rencontre une "nouvelle" instruction:
Disposition de la mémoire des objets
La disposition des objets stockés en mémoire peut être divisée en 3 zones:
En-tête d'objet: stocke les propres données d'exécution de l'objet, telles que le code de hachage, l'âge de la génération GC, le drapeau d'état de verrouillage, le verrouillage tenu par les threads, l'identifiant de thread biaisé, etc. Une autre pièce est un pointeur de type, c'est-à-dire un pointeur vers les métadonnées de classe de l'objet. La machine virtuelle utilise ce pointeur pour déterminer quelle instance de classe appartient l'objet.
Données d'instance: les informations vraiment valides de l'objet, le contenu de divers types de champ définis dans le programme;
Supplément d'alignement: non essentiel, le rôle des occupants.
Positionnement d'accès à l'objet
Les programmes Java exploitent des objets d'instance sur le tas via des références sur la pile. Par exemple
Personne p = new personne ();
Ici, P est une référence, et l'objet de personne produit par New est une instance.
Cette référence ne spécifie pas comment localiser et accéder à l'emplacement spécifique des objets dans le tas. Il existe deux méthodes d'accès grand public:
poignée. Un morceau de mémoire sera divisé en tas Java en tant que pool de poignée, qui fait référence à l'adresse de poignée de l'objet, et la poignée contient les données d'instance de l'objet et le type de données. L'avantage est que lorsque l'objet est déplacé, il vous suffit de modifier l'adresse dans la poignée et que la référence elle-même n'a pas besoin d'être modifiée.
Pointeur direct. L'adresse de l'objet est directement stockée dans la référence. L'avantage est que la vitesse est plus rapide, et comme la référence représente directement l'adresse de l'objet d'instance, une opération de positionnement du pointeur est enregistrée. C'est exactement comme ça que Sun Hotspot utilise.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.