Maison > Java > javaDidacticiel > le corps du texte

Exemple graphique de modèle de mémoire JVM

PHP中文网
Libérer: 2017-06-20 16:44:03
original
2084 Les gens l'ont consulté

1. Schéma du modèle de mémoire JVM

La zone de données d'exécution JVM (JVM Runtime Area) fait en fait référence à la division et à l'allocation de l'espace mémoire JVM pendant l'exécution de la JVM. Deux images trouvées sur Internet sont les suivantes (je pense personnellement que la deuxième image Native Method Stack devrait être dessinée dans le module Java Thead) :

2. Introduction à chaque zone de données

1. Zone Pile

La pile est divisée en pile de machines virtuelles Java et locale pile de méthodes

  • Le point clé est lapile de machine virtuelle Java, qui est threadprivée et a le même cycle de vie que le thread.

  • Chaque exécution de méthode créera un cadre de pile , qui est utilisé pour stocker table de variables locales, pile d'opérations, lien dynamique, sortie de méthode , etc. . Chaque méthode est appelée jusqu'à ce qu'elle soit exécutée. Correspond au processus par lequel un cadre de pile est poussé dans la pile jusqu'à être retiré de la pile dans la machine virtuelle.

  • La pile fait généralement référence à la partie de table de variables locales, qui stocke les 8 types de données de base connus lors de la compilation, ainsi que les références d'objets et les adresses d'instructions. La table des variables locales est allouée lors de la compilation Lors de la saisie d'une méthode, la taille mémoire allouée aux variables locales dans cette pile est déterminée.

  • Il y aura deux exceptions : StackOverFlowError et OutOfMemoneyError. Lorsque la profondeur de la pile de requêtes de thread est supérieure à la profondeur autorisée par la machine virtuelle, une erreur StackOverFlowError est générée ; la pile de la machine virtuelle est développée dynamiquement et lorsque l'expansion ne peut pas s'appliquer à suffisamment d'espace mémoire, une erreur OutOfMemoneyError est générée.

  • La pile de méthodes locales sert les méthodes locales (natives) utilisées par la machine virtuelle et est également privée de thread .

2. Zone du tas

  • Le tas est une zone partagée par tous les threads et est créé lorsque la machine virtuelle démarre, dont le seul but est de stocker des instances d'objets .

  • La zone tas est la zone principale de gc. Elle est généralement divisée en deux blocs, la jeune génération et l'ancienne génération. Pour être plus détaillé, la jeune génération est divisée en zone Eden où les objets nouvellement créés sont stockés. Du survivant et Au survivant enregistrent les objets qui ont survécu au gc. Par défaut, chacun représente 8:1:1.
    Cependant, de nombreux articles présentent qu'elle est divisée en 3 blocs et que la zone de méthode est comptée comme la génération permanente. Ceci est probablement basé sur la division des machines virtuelles Hotspot et, par exemple, IBM j9 n'a pas d'introduction à la génération permanente. Quel que soit le degré de partitionnement, les instances d'objet sont stockées.

  • Il y aura une exception OutOfMemoneyError

Zone de méthode

  • La zone est partagée par tous les threads et est utilisée pour stocker les informations de classe, les constantes, les variables statiques et d'autres données qui ont été chargées par la machine virtuelle . Décrit par la machine virtuelle Java comme une partie logique du tas. Il est d'usage de l'appeler aussi la génération permanente

  • La collecte des déchets visite rarement cette zone, mais elle doit également être recyclée, principalement pour le recyclage constant de la piscine et le déchargement de type.

  • Le pool constant est utilisé pour stocker divers bytecodes et références de symboles générés pendant le temps de compilation Le pool constant a un certain degré de dynamique. . Les constantes générées lors de la compilation peuvent y être stockées ; les constantes pendant l'exécution peuvent également être ajoutées au pool de constantes, comme la méthode inn() de string.

4. Compteur de programme

  • Le numéro de ligne exécuté par le courant Indicateur de fil . Déterminez l'instruction suivante en modifiant la valeur du compteur, comme les boucles, branches, sauts, gestion des exceptions, récupération de thread, etc. qui reposent tous sur des compteurs pour terminer .

  • Le multithreading des machines virtuelles Java est implémenté en changeant de thread à tour de rôle et en allouant du temps d'exécution du processeur. Pour que la commutation des threads revienne à la bonne position, chaque thread nécessite un compteur de programme indépendant, il est donc privé du thread.

  • La seule machine virtuelle Java ne spécifie aucun bloc OutofMemoryError

Résumé de la zone de données

Nom

Caractéristiques

Fonction

Paramètres de configuration

Exception

Compteur de programme

Occupe une petite mémoire, le thread privé, le cycle de vie est le même que celui du thread

Indicateur de numéro de ligne à peu près bytecode

Aucun

Aucun

Pile de machines virtuelles

Thread privé, le cycle de vie est le même que celui du thread, Utiliser l'espace mémoire continu

Modèle de mémoire pour l'exécution de méthodes Java, stockant les tables de variables locales, les piles d'opérations, les liens dynamiques, les sorties de méthode et d'autres informations

-Xss

StackOverflowError

OutOfMemoryError

tas Java

Partage de threads, le cycle de vie est de la même manière que la machine virtuelle, vous pouvez enregistrer des instances d'objet sans utiliser d'adresses mémoire consécutives

Toutes les instances d'objet (y compris les tableaux) doivent être allouées sur le tas <.>

-Xms

-Xsx

-Xmn

OutOfMemoryError

Zone Méthode

Partage de thread, le cycle de vie est le même que celui de la machine virtuelle, vous ne pouvez

ne pas utiliser d'adresses mémoire continue

Données de stockage telles que les informations de classe, les constantes, les variables statiques, le code compilé par un compilateur juste à temps qui ont été chargés par la machine virtuelle

-XX:PermSize:16M

-XX:MaxPermSize:64M

OutOfMemoryError

Pool de constantes d'exécution

Partie de la zone de méthode, dynamique

Stockage des littéraux et des références de symboles

4. Extension : Mémoire directe

Mémoire directe (Direct Mémoire) ne fait pas partie de la zone de données d'exécution de la machine virtuelle et n'est pas une zone de mémoire définie dans la spécification de la machine virtuelle Java, mais cette partie de la mémoire est également fréquemment utilisée et peut également provoquer des exceptions OutOfMemoryError, nous l'expliquerons donc ici.

La classe NIO (NewInput/Output) a été récemment ajoutée au JDK 1.4, et une méthode d'E/S basée sur Channel et Buffer a été introduite, qui peut être allouée directement à l'aide de la bibliothèque de fonctions natives Mémoire hors tas, puis opérer via un objet DirectByteBuffer stocké dans le tas Java comme référence à cette mémoire. Cela peut améliorer considérablement les performances dans certains scénarios, car cela évite de copier des données entre le tas Java et le tas natif.

5. Extension : comparaison du tas et de la pile

Certaines personnes divisent souvent la mémoire Java en mémoire tas (Heap) et en mémoire pile (Stack). la division est en réalité bien plus compliquée que cela. La popularité de cette méthode de division montre seulement que les zones de mémoire auxquelles la plupart des programmeurs accordent le plus d'attention et qui sont les plus étroitement liées à l'allocation de mémoire des objets sont ces deux zones.

Le tas est flexible, mais pas sûr. Pour les objets, nous devons les créer et les détruire dynamiquement. Nous ne pouvons pas dire que les objets créés ultérieurement ne sont pas détruits, et les objets créés précédemment ne peuvent pas être détruits. Dans ce cas, notre programme sera difficile à exécuter, donc le tas est utilisé. pour stocker des objets en Java. Une fois l'objet dans le tas détruit, si nous continuons à référencer cet objet, la fameuse NullPointerException se produira. C'est le défaut du tas - une logique de référence incorrecte ne sera découverte qu'au moment de l'exécution.

La pile n'est pas flexible, mais elle est stricte, sûre et facile à gérer. Car tant que la référence supérieure n'est pas détruite, la référence inférieure doit toujours être là. Dans la plupart des programmes, les variables et références définies en premier sont poussées sur la pile, et celles définies ultérieurement sont poussées sur la pile. et les références à l'intérieur du bloc sont stockées dans la zone d'entrée lorsqu'un bloc est poussé sur la pile et lorsqu'un bloc se termine, il est retiré de la pile. En comprenant ce mécanisme, nous pouvons facilement comprendre le concept de portée dans diverses programmations. En même temps, c'est aussi l'avantage de la pile : une logique de référence incorrecte sera perdue lors de la compilation et pourra être découverte à tout moment.

Stack : stocke principalement les références et les types de données de base.

Heap – utilisé pour stocker les instances d'objet produites par new.

Référence :

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal