La composition de JVM (Java Virtual Machine) est divisée en : le composant global et le composant de zone de données d'exécution.
1. La composition globale de la JVM
La composition globale de la JVM peut être divisée en quatre parties :
类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)
Le but de chaque composant :
Avant que le programme ne soit exécuté, le code java doit être converti en un bytecode (fichier de classe).La jvm doit d'abord charger le bytecode dans la zone de données d'exécution (Runtime Data Area) d'une certaine manière via un chargeur de classe (ClassLoader). ), et le fichier de bytecode est un ensemble de spécifications de jeu d'instructions de la jvm, qui ne peuvent pas être directement transmises au système d'exploitation sous-jacent pour exécution, donc un moteur d'exécution d'analyseur de commandes spécifique (moteur d'exécution) est nécessaire pour traduire le bytecode dans le instructions système sous-jacentes, puis Il est remis à la CPU pour exécution, et dans ce processus, il est nécessaire d'appeler l'interface de la bibliothèque native de l'interface (Native Interface) d'autres langages pour réaliser la fonction de l'ensemble du programme. la responsabilité et la fonction de ces quatre composantes principales.
Ce que nous appelons généralement la composition jvm fait référence à la zone de données d'exécution (Runtime Data Area), car la zone qui nécessite généralement que les programmeurs déboguent et analysent est la "zone de données d'exécution", ou plus précisément, la "zone de données d'exécution". " Le module Heap (heap) à l'intérieur, puis regardons de quels modules la zone de données d'exécution est composée.
2. Composition de la zone de données d'exécution
La zone de données d'exécution de jvm peut être légèrement différente pour différentes implémentations de machines virtuelles, mais elles suivent toutes la spécification de la machine virtuelle Java.Selon la spécification de la machine virtuelle Java 8, la mémoire gérée par la machine virtuelle Java inclura le temps d'exécution suivant zones de données :
程序计数器(Program Counter Register)
Java虚拟机栈(Java Virtual Machine Stacks)
本地方法栈(Native Method Stack)
Java堆(Java Heap)
方法区(Methed Area)
Ensuite, nous introduisons le but de chaque zone séparément.
①, compteur de programme
Le compteur de programme (Program Counter Register) est un petit espace mémoire, qui peut être considéré comme l'indicateur de numéro de ligne du bytecode exécuté par le thread courant. Dans le modèle conceptuel de la machine virtuelle, le travail de l'analyseur de bytecode est de sélectionner la prochaine instruction de bytecode à exécuter en modifiant la valeur du compteur. Les fonctions de base telles que le branchement, la boucle, le saut, la gestion des exceptions et la récupération de thread sont tous besoin de s'appuyer sur ce compteur pour terminer.
Fonctionnalité : mémoire privée
Étant donné que le multithreading de jvm est réalisé en commutant les threads à tour de rôle et en allouant du temps d'exécution au processeur, c'est-à-dire qu'à tout moment, un processeur (ou un cœur) n'exécutera les instructions que dans un seul thread. Par conséquent, afin de restaurer la position d'exécution correcte après le changement de thread, chaque thread possède un compteur de programme indépendant.
Dispositions d'exception : Aucune
Si le thread exécute une méthode en Java, le compteur programme enregistre l'adresse de l'instruction bytecode de la machine virtuelle en cours d'exécution. S'il s'agit d'une méthode Native, ce compteur est vide (indéfini), donc cette zone mémoire est la seule de la Machine virtuelle Java La zone d'OutOfMemoryError n'est pas spécifiée dans la spécification.
②, pile de machines virtuelles Java
Les piles de machines virtuelles Java (Java Virtual Machine Stacks) décrivent le modèle de mémoire de l'exécution de la méthode Java. Chaque méthode créera un cadre de ligne (Stack Frame) pour stocker des tables de variables locales, des piles d'opérandes, des liens dynamiques, des informations telles que la sortie de la méthode, le processus de l'invocation à l'achèvement de l'exécution de chaque méthode correspond au processus d'un cadre de ligne poussé dans la pile de la machine virtuelle pour sortir de la pile.
Fonctionnalités : La mémoire est privée et son cycle de vie est le même que celui des threads.
Spécification d'exception : StackOverflowError, OutOfMemoryError
1. Si la profondeur de pile demandée par le thread est supérieure à la profondeur de pile autorisée par la machine virtuelle, une exception StackOverflowError sera levée.
2. Si la machine virtuelle peut être étendue dynamiquement, si l'extension ne s'applique pas à suffisamment de mémoire, une exception OutOfMemoryError sera levée.
③, pile de méthode locale
La pile de méthodes natives (Native Method Stack) est identique à la pile de machines virtuelles, sauf que la pile de machines virtuelles sert la méthode Java, tandis que la pile de méthodes natives sert à la machine virtuelle pour appeler la méthode native.
Dans la spécification de la machine virtuelle Java, il n'existe aucune exigence particulière pour la pile de méthodes locales et la machine virtuelle peut l'implémenter librement. Par conséquent, dans la machine virtuelle Sun HotSpot, la pile de méthodes locales et la pile de machines virtuelles sont directement combinées en une seule. .
Fonctionnalités et exceptions : Identique à la pile de machines virtuelles, veuillez vous reporter aux points de connaissance ci-dessus.
④, tas Java
Le tas Java (Java Heap) est la plus grande partie de la mémoire de la machine virtuelle Java. Il est partagé par tous les threads et créé au démarrage de la machine virtuelle. Le seul but du tas Java est de stocker des instances d'objet. Presque toutes les instances d'objet allouer de la mémoire ici. , avec le développement des compilateurs JIT et la maturité progressive de la technologie d'analyse d'échappement, la technologie d'allocation de pile et d'optimisation de remplacement scalaire conduira à quelques changements subtils. Tous les objets sont alloués sur le tas et deviennent progressivement moins "absolus" . .
Fonctionnalités : mémoire partagée
Spécification d'exception : OutOfMemoryError
S'il n'y a pas de mémoire dans le tas pour terminer l'allocation d'instance et que le tas ne peut plus être étendu, une OutOfMemoryError sera levée.
La spécification de la machine virtuelle Java stipule que le tas Java peut être dans un espace mémoire physiquement discontinu, tant qu'il est logiquement continu, tout comme notre espace disque. En termes d'implémentation, il peut également être de taille fixe ou évolutif, mais les machines virtuelles grand public actuelles sont toutes évolutives, contrôlées par -Xmx et -Xms.
⑤. Zone de méthode
La zone de méthode (Methed Area) est utilisée pour stocker des données telles que des informations de classe, des constantes, des variables statiques et du code compilé juste-à-temps qui ont été chargés par la machine virtuelle.
Malentendu : la zone de méthode n'est pas égale à la génération permanente
De nombreuses personnes appellent la zone de méthode la "génération permanente" (génération permanente), et les deux ne sont pas équivalentes en substance, mais l'équipe de récupération de place de la machine virtuelle HotSpot a étendu la collecte générationnelle GC à la zone de méthode, ou elle est utilisée pour la génération permanente. La zone de méthode n'est implémentée que par la génération, ce qui évite d'avoir à écrire du code de gestion de la mémoire spécifiquement pour la zone de méthode, mais la "génération permanente" est également supprimée dans Jdk8, et la zone de méthode est implémentée à l'aide de la mémoire native .
Fonctionnalités : mémoire partagée
Spécification d'exception : OutOfMemoryError
Lorsque la méthode ne peut pas répondre aux exigences d'allocation de mémoire, une exception OutOfMemoryError est levée.
3. Élargir les connaissances
Cette section développera certaines connaissances liées à l'allocation de mémoire.
pool de constantes d'exécution
Le pool de constantes d'exécution fait partie de la zone de méthode. En plus de la version de la classe, des champs, des méthodes, des interfaces et d'autres informations de description dans le fichier de classe, il existe également un pool de constantes (Constant Pool Table) utilisé pour stocker divers types générés. lors de la compilation. Références littérales et symboliques, cette partie entre dans la zone de méthode après le chargement de la classe et s'exécute dans le pool de constantes, comme la méthode intern() de la classe String.
mémoire directe
La mémoire directe (mémoire directe) ne fait pas partie de la zone de données lorsque la machine virtuelle est en cours d'exécution, mais cette partie de la mémoire est également fréquemment utilisée et peut provoquer une erreur OutOfMemoryError. Dans JDK 1.4, la classe NIO est nouvellement ajoutée, et une méthode IO basée sur Channel et buffer Buffer est introduite. Elle utilise un objet DirectByteBuffer stocké dans le tas Java comme opération de référence de cette mémoire, elle est donc plus efficace et évite le temps nécessaire au tas Java et au tas natif pour échanger des données dans les deux sens.
Remarque : L'allocation directe de mémoire ne sera pas limitée par la taille du tas Java, mais limitée par la taille totale de la mémoire de la machine. Lors de la définition des paramètres de la machine virtuelle, la mémoire directe ne peut pas être ignorée. Définissez la mémoire réelle sur -Xmx, donc que la somme des zones mémoire est supérieure à En raison de la limitation de la mémoire physique, une exception OutOfMemoryError se produit lors de l'expansion dynamique.
4. Résumé
Cet article parle des principaux composants de jvm et de la composition de la zone de données d'exécution la plus importante (Zone de données d'exécution). Le tas Java, en tant que plus grande zone de mémoire, sera la zone de mémoire sur laquelle les développeurs se concentrent, ainsi que le relation entre la zone de méthode et la zone de constante d'exécution et la génération permanente.Enfin, le processus d'implémentation de la mémoire directe doit être utilisé lorsqu'il est utilisé.Le point principal, j'espère vous aider à mieux comprendre jvm.
Extrait du blog : http://www.iotjike.com/article/37