堆(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.
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
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
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=
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 deet de deux morceaux de même taille
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 :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 utiliserSurvivor Space
pour ajuster les tailles de-XX:SurvivorRation
etEden Space
.Survivor Space
.
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.
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.
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. .
La mémoire tas Java est allouée par le système d'exploitation Une partie de la mémoire de la JVM.
Lorsque nous créons des objets, ils sont stockés dans la mémoire tas Java
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.
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.
Vous pouvez utiliser JConsole ou Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory() pour afficher la taille de la mémoire du tas en Java.
Vous pouvez utiliser la commande "jmap" pour obtenir le tas dump et "jhat" pour analyser le tas dump.
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.
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.
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.
- 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!