Maison  >  Article  >  Java  >  La structure interne et le mécanisme de fonctionnement de JVM

La structure interne et le mécanisme de fonctionnement de JVM

尚
avant
2020-06-16 16:23:282307parcourir

La structure interne et le mécanisme de fonctionnement de JVM

1. Introduction à la composition de la mémoire Java : 堆(Heap) et 非堆(Non-heap) mémoire

Selon à la déclaration officielle : "La machine virtuelle Java a un tas, qui est la zone de données d'exécution à partir de laquelle la mémoire pour toutes les instances de classe et les tableaux est allouée.

Le tas est créé au démarrage de la machine virtuelle Java. ." "Dans La mémoire en dehors du tas dans la JVM est appelée mémoire non-heap (Non-heap memory). On constate que JVM gère principalement deux types de mémoire : tas et non tas .

En termes simples, le tas est la mémoire accessible au code Java et est réservée aux développeurs ; le non-heap est la mémoire réservée à la JVM pour son propre usage, donc la mémoire nécessaire à la zone méthode, interne à la JVM. traitement ou optimisation (comme le cache de code compilé JIT), chaque structure de classe (telle que le pool de constantes d'exécution, les données de champ et de méthode) et le code des méthodes et des constructeurs sont dans une mémoire non tas.

2. Modèle de zone mémoire JVM

La structure interne et le mécanisme de fonctionnement de JVM

1. 🎜> Également appelé « génération permanente » et « non-heap », il est utilisé pour stocker les informations de classe, les constantes et les variables statiques chargées par la machine virtuelle. Il s'agit d'une zone mémoire partagée par chaque thread. La valeur minimale par défaut est de 16 Mo et la valeur maximale est de 64 Mo. Vous pouvez limiter la taille de la zone de méthode via les paramètres et -XX:PermSize. -XX:MaxPermSize

Pool de constantes d'exécution : Il fait partie de la zone méthode dont le contenu principal provient du chargement de Class par la JVM.

En plus des informations de description telles que la version de la classe, les champs, les méthodes, les interfaces, etc., le fichier Class dispose également d'un pool de constantes, qui est utilisé pour stocker diverses références de symboles générées par le compilateur. sera abordé dans Une fois la classe chargée, elle est placée dans le pool de constantes d'exécution dans la zone des méthodes.

2. La pile de machines virtuelles

décrit le modèle de mémoire d'exécution de la méthode Java : lorsque chaque méthode est exécutée, un "cadre de pile" est créé pour le stockage de la table de variables locales. (y compris les paramètres), la pile d'opérations, la sortie de méthode et d'autres informations. Le processus depuis chaque méthode appelée jusqu'à la fin de l'exécution correspond au processus d'un cadre de pile depuis son insertion dans la pile jusqu'à sa sortie de la pile dans la pile de la machine virtuelle. Le cycle de déclaration est le même que celui du thread et est privé du thread.

La table de variables locales stocke divers types de données de base connus du compilateur (

, boolean, byte, char, short, int, float, long), référence d'objet (pointeur de référence, pas l'objet lui-même), parmi lesquels les données de 64 bits de long et de type double occuperont l'espace de 2 variables locales, et les autres types de données n'en occuperont que 1. double

L'espace mémoire requis pour la table de variables locales est alloué lors de la compilation. Lors de la saisie d'une méthode, il est complètement déterminé combien de variables locales cette méthode doit allouer dans le cadre de pile ne modifiera pas le. taille de la table des variables locales.

3. La pile de méthodes locales

est fondamentalement similaire à la pile de machines virtuelles. La différence est que la pile de machines virtuelles sert les méthodes Java exécutées par la machine virtuelle. , tandis que la pile de méthodes locales est constituée de méthodes Serve Native.

4. Heap

Également appelé tas Java, le tas GC est la plus grande zone mémoire de la mémoire gérée par la machine virtuelle Java, et est également la mémoire partagée par chaque thread. Région, créée au démarrage de la JVM. Cette zone mémoire stocke les instances d'objets et les tableaux (tous les nouveaux objets).

La taille est définie via les paramètres

(valeur minimale) et -Xms (valeur maximale) -Xms est la mémoire minimale demandée au démarrage de la JVM. La valeur par défaut est 1/64 du fonctionnement. mémoire physique du système mais inférieure à 1 Go, -Xmx est la mémoire maximale que la JVM peut demander. La valeur par défaut est 1/4 de la mémoire physique mais inférieure à 1 Go. Par défaut, lorsque la mémoire du tas libre est inférieure à 40 %. , la JVM augmentera le tas à la taille spécifiée par -Xmx Vous pouvez passer -Xmx pour spécifier ce rapport ; lorsque la mémoire du tas libre est supérieure à 70 %, la JVM réduira la taille du tas à la taille spécifiée par. -Xms. Vous pouvez utiliser -XX:MinHeapFreeRation= pour spécifier ce rapport pour le système en cours d'exécution, afin d'éviter que la taille du tas ne soit fréquemment ajustée pendant l'exécution. Habituellement, les valeurs de -Xms et -Xmx sont définies sur la même valeur. . XX:MaxHeapFreeRation=

Étant donné que les collectionneurs utilisent désormais des algorithmes de collecte générationnelle, le tas est divisé en nouvelle génération et ancienne génération. La nouvelle génération stocke principalement les objets nouvellement créés et les objets qui ne sont pas encore entrés dans l'ancienne génération. L'ancienne génération stocke les objets qui ont survécu à plusieurs GC mineurs.

Nouvelle génération : les nouveaux objets créés par le programme allouent de la mémoire de la nouvelle génération. La nouvelle génération se compose de

et de deux morceaux de même taille Eden Space (généralement également appelés S0 et S1). ou From et To), vous pouvez utiliser le paramètre -Xmn pour spécifier la taille de la nouvelle génération, ou vous pouvez utiliser Survivor Space pour ajuster les tailles de -XX:SurvivorRation et Eden Space. Survivor Space

Ancienne génération : utilisée pour stocker les objets qui ont survécu plusieurs fois au GC de nouvelle génération, tels que les objets de cache peuvent également entrer directement dans l'ancienne génération :

.

1. Les objets volumineux peuvent être définis par les paramètres de démarrage -XX:PretenureSizeThreshold=1024 (l'unité est en octets, la valeur par défaut est 0) pour indiquer que lorsque l'objet dépasse la taille, il ne sera pas alloué dans la nouvelle génération, mais sera alloué directement dans l'ancienne génération.

2. Pour les objets de grand tableau, aucun objet externe n'est référencé dans le tableau. La taille mémoire occupée par l'ancienne génération est la valeur correspondant à -Xmx moins la valeur correspondant à -Xmn.

La structure interne et le mécanisme de fonctionnement de JVM

Young Generation        即图中的Eden + From Space + To Space
Eden                    存放新生的对象
Survivor Space          有两个,存放每次垃圾回收后存活的对象
Old Generation          Tenured Generation 即图中的Old Space 
                        主要存放应用程序中生命周期长的存活对象

5. Le compteur de programme

est la plus petite zone mémoire , sa fonction est l'indicateur de numéro de ligne du bytecode exécuté par le thread actuel. Dans le modèle de machine virtuelle, l'interpréteur de bytecode sélectionne le prochain bytecode qui doit être exécuté en modifiant la valeur de ce compteur lors du fonctionnement des fonctions de base telles que les instructions. , les branches, les boucles, la gestion des exceptions et la récupération des threads reposent tous sur des compteurs.

3. Mémoire directe

La mémoire directe ne fait pas partie de la mémoire de la machine virtuelle et n'est pas non plus une zone de mémoire définie dans le virtuel Java. spécification de la machine. Le NIO nouvellement ajouté dans jdk1.4 introduit la méthode IO du canal et du tampon. Il peut appeler la méthode native pour allouer directement de la mémoire hors tas. Cette mémoire hors tas est la mémoire locale et n'affectera pas la taille de la mémoire tas. .

4. 10 points sur la mémoire tas Java

  1. La mémoire tas Java est allouée par le système d'exploitation Une partie de la mémoire de la JVM.

  2. Lorsque nous créons des objets, ils sont stockés dans la mémoire tas Java

  3. Pour faciliter le garbage collection, l'espace tas Java est divisé en trois. zones, respectivement appelées Nouvelle Génération, Ancienne Génération ou Tenured Generation, et Perm Space.

  4. Vous pouvez ajuster la taille de l'espace du tas Java en utilisant les options de ligne de commande JVM -Xms, -Xmx, -Xmn. N'oubliez pas d'ajouter "M" ou "G" après la taille pour indiquer l'unité. Par exemple, vous pouvez utiliser -Xmx256m pour définir la taille maximale du segment de mémoire sur 256 Mo.

  5. Vous pouvez utiliser JConsole ou Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory() pour afficher la taille de la mémoire du tas en Java.

  6. Vous pouvez utiliser la commande "jmap" pour obtenir le tas dump et "jhat" pour analyser le tas dump.

  7. L'espace de tas Java est différent de l'espace de pile. L'espace de pile est utilisé pour stocker les piles d'appels et les variables locales.

  8. Le garbage collector Java est utilisé pour récupérer la mémoire occupée par les objets morts (objets qui ne sont plus utilisés) puis la libérer dans l'espace du tas Java.

  9. Lorsque vous rencontrez java.lang.outOfMemoryError, ne soyez pas nerveux. Parfois, il suffit d'augmenter l'espace du tas, mais si cela arrive souvent, vous devez regarder le programme Java. . Il n'y a pas de fuite de mémoire.

  10. Veuillez utiliser les outils d'analyse Profiler et Heap dump pour afficher l'espace du tas Java et voir la quantité de mémoire allouée à chaque objet.

Pour plus de connaissances connexes, veuillez faire attention à la colonne Tutoriel de base 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer