Détails Java JVM:
Connaissances connexes sur JVM
1. Mémoire de tas et de pile
1. La mémoire de pile dans JVM stocke principalement des références aux types de base de variables et d'objets.
2. La mémoire de tas dans JVM stocke principalement des objets et des tableaux créés avec des chaînes de longueur de variables (StringBuilder et StringBuffered) sont stockées dans la mémoire du tas.
L'avantage de l'utilisation du tas est qu'il est alloué dynamiquement à l'espace de stockage, ce qui est plus flexible, mais l'inconvénient est qu'il est plus lent pour allouer dynamiquement la mémoire; Bien que l'utilisation de la pile soit plus rapide et le partage de données peut être réalisé, mais l'inconvénient est que la taille des données et la durée de vie de la pile doivent être déterminées et manquer de flexibilité
3. L'allocation de stockage statique est utilisée pour stocker des variables statiques et des blocs de code statique.
2. Compréhension de JVM
JVM est une machine virtuelle Java. Il bloque les informations liées à la plate-forme du système d'exploitation spécifique, de sorte que le programme Java ne génère que du code d'objet (code d'octet) en cours d'exécution sur la machine virtuelle Java, afin que le fonctionnement multiplateforme puisse être réalisé;
Son principe est: le fichier source Java est compilé en programmes ByteCode via le compilateur Java, et chaque instruction est traduite en code machine de différentes plates-formes via JVM et exécute une plate-forme spécifique;
La zone de mémoire de JVM est principalement divisée en: zone de méthode, pile JVM, tas, pile de méthode locale, compteur de programmes
Compteur du programme: utilisé pour enregistrer les instructions actuellement exécutées, qui est le seul domaine sans OOM;
JVM Stack: le fil est privé. Chaque thread créera une pile JVM en même temps. Il stocke les variables de base locales dans le thread actuel, les résultats de retour partiel, la trame de pile et l'adresse de référence d'objet;
Tas: partage de fil, utilisé pour stocker certains objets et tableaux; Puisqu'il est partagé, des verrous sont nécessaires, ce qui conduit à des frais généraux élevés;
Zone de méthode: Cette zone de méthode correspond à une génération persistante, qui stocke les informations de la classe (nom, modificateur, etc.), variables statiques dans la classe, constantes définies dans la classe avec final, etc.;
Pile de méthode locale: utilisée pour prendre en charge l'exécution des méthodes natives et pour stocker l'état de l'appel de chaque méthode native;
La collection Java Garbage se concentre principalement sur le tas et les zones de méthode: le tas est divisé en nouvelle génération et à l'ancienne génération, et généralement les objets qui viennent d'être nouveaux seront placés dans la nouvelle génération; et la nouvelle génération est divisée en zone d'Eden et deux zones de survivants;
Le mécanisme de la collecte des ordures est: Déterminez d'abord quels objets sont des ordures, c'est-à-dire qu'ils ne sont plus utilisés, puis utilisent les algorithmes correspondants (algorithme de protection de marque, algorithme de copie, algorithme de trait de marque, algorithme de collecte générationnel) pour collecter le contrat;
1. Algorithme de compensation de marque:
Il est divisé en deux étapes, le stade de marquage et l'étape de compensation. Tout d'abord, marquez l'objet qui doit être recyclé, puis recyclez l'espace occupé par l'objet de marquage;
Son implémentation est relativement simple, mais son inconvénient est qu'il est facile de générer des fragments de mémoire, ce qui entraîne l'incapacité de trouver suffisamment de mémoire lors de l'allocation d'espace pour de grands objets à l'avenir et de déclencher une nouvelle action de collecte de déchets à l'avance;
2. Copier l'algorithme:
Afin de résoudre les lacunes de l'algorithme de nettoyage de marque, l'algorithme de copie divise la mémoire en deux zones de taille égale en fonction de la capacité, et une seule d'entre elles est utilisée à la fois. Une fois qu'une pièce est utilisée, l'objet encore survie est copié dans une autre zone, puis la zone utilisée est nettoyée, de sorte que la fragmentation n'est pas facile à se produire;
Le problème de la fragmentation de la mémoire est résolu, mais l'inconvénient est que la mémoire utilisée est réduite à la moitié de l'original, et l'efficacité de copie est liée au nombre d'objets survivants. Lorsque le nombre est important, l'efficacité est considérablement réduite;
3. Algorithme d'organisation de marquage
Afin de résoudre les défauts de l'algorithme de copie, l'algorithme Mark-Tidy est né, et le stade de marquage était également comme l'algorithme de nettoyage de marque. Tout d'abord, les objets qui doivent être recyclés sont marqués, mais il ne les recyclez pas directement, mais déplace tous les objets survivants de l'autre côté, puis nettoie la mémoire à l'extérieur de la limite;
4. Algorithme de collecte générationnelle
Il s'agit actuellement de l'algorithme le plus utilisé. Son idée principale est de diviser la mémoire en plusieurs domaines différents en fonction du cycle de survie de l'objet. Généralement, la zone de tas est divisée en nouvelle génération et à l'ancienne génération. La caractéristique de l'ancienne génération est qu'il y a moins d'objets qui doivent être recyclés chaque fois que les ordures sont collectées, alors qu'il y a plus de nouvelle génération, donc différents algorithmes sont adoptés;
À l'heure actuelle, la plupart de la nouvelle génération utilise des algorithmes de copie, mais en fait, la nouvelle génération n'est pas divisée en un rapport 1: 1. D'une manière générale, la nouvelle génération est divisée en un plus grand espace Eden et deux plus petits espaces de survivants. Chaque fois que l'espace Eden et l'un des espaces de survivants sont utilisés, lorsqu'ils sont recyclés, les objets encore survivants dans Eden et survivant sont copiés dans un autre espace de survivant, puis Eden et les espaces de survivants qui viennent d'être utilisés sont nettoyés.
Parce que la vieillesse est que seul un petit nombre d'objets sont recyclés à chaque fois, l'algorithme de compact Mark est généralement utilisé.
Notez qu'il existe une autre génération en dehors de la zone du tas, qui est la génération permanente, qui est utilisée pour stocker des classes, des constantes, des descriptions de méthodes, etc. Le recyclage de la génération permanente recycle principalement deux parties: les constantes jetées et les classes inutiles.
Alors, comment déterminons-nous quel objet est «ordures»?
Méthode 1. Méthode de comptage de référence:
En Java, il est associé à des objets via des références, c'est-à-dire que si vous souhaitez faire fonctionner des objets, cela doit être fait par le biais de références. Ensuite, il est évident qu'un moyen facile est de juger si un objet peut être recyclé par le comptage de références. Sans perdre la généralité, si un objet n'a aucune référence qui lui est associé, cela signifie que l'objet est tout à fait peu susceptible d'être utilisé ailleurs, puis l'objet devient un objet recyclable. Cette méthode devient la méthode de comptage de référence.
Avantages: mise en œuvre simple et grande efficacité
Inconvénients: incapable de résoudre le problème des références circulaires
Méthode 2. Méthode d'analyse de l'accessibilité:
L'idée de base de cette méthode est de rechercher une série d'objets "GC Roots" comme point de départ. S'il n'y a pas de chemin accessible entre les "racines GC" et un objet, l'objet est dit inaccessible. Cependant, il convient de noter que l'objet jugé inaccessible ne peut pas nécessairement devenir un objet recyclable. Un objet jugé comme inaccessible doit passer par au moins deux processus de marquage pour devenir un objet recyclable. S'il n'y a toujours pas de possibilité de devenir un objet recyclable pendant ces deux processus de marquage, il deviendra essentiellement un objet recyclable.
Quels objets peuvent être des racines GC?
1. Objet référencé dans la pile JVM (table de variable locale dans le cadre de pile).
2. Objet référencé par les attributs statiques de classe dans la zone de la méthode.
3. Objets référencés par des constantes dans la zone de la méthode
4. Objet référencé par JNI (c'est-à-dire la méthode native générale) dans la pile de méthode locale.
Pour les programmeurs, nous pouvons également réduire les frais généraux GC par certaines méthodes:
1. N'affichez pas la méthode System.gc ()
2. Minimiser l'utilisation d'objets temporaires
3. Lorsque l'objet n'est pas utilisé, le paramètre d'affichage est défini sur NULL
4. Essayez d'utiliser StringBuilder au lieu de chaînes accumulées de chaîne
5. Si vous pouvez utiliser des types de variables de base (int long), n'utilisez pas d'objets (entier, long)
6. Utilisez le moins possible des variables d'objet statique
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!