Maison >Java >javaDidacticiel >Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)

Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)

不言
不言avant
2019-02-27 11:21:032958parcourir

Le contenu de cet article concerne l'analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction par image et texte). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Le processus d'exécution et de compilation du code Java

Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)

Gestion de la mémoire Java

Division du modèle de mémoire java

Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)

Accès au positionnement des objets

Object obj = new Object();

Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)

Création et initialisation d'un objet Java

Une fois l'objet Java créé, il aura sa propre zone dans la mémoire tas, suivi du processus d'initialisation de l'objet. Résumé de la séquence d'initialisation des membres de la classe : d'abord statique, puis normal, puis construct, d'abord la classe parent, puis la classe enfant, et l'ordre d'écriture au même niveau

  1. Exécuter la classe parent variables statiques et blocs de code statiques d'abord, puis exécutez d'abord les variables statiques de sous-classe et les blocs de code statiques

  2. Exécutez d'abord les variables ordinaires et les blocs de code de la classe parent, puis exécutez le constructeur de la classe parent (statique méthode)

  3. Exécutez d'abord les variables ordinaires et les blocs de code de la sous-classe, puis exécutez le constructeur de la sous-classe (méthode statique)

  4. L'initialisation de la méthode statique précède méthodes ordinaires, et l'initialisation statique n'est effectuée que lorsque cela est nécessaire et n'est initialisée qu'une seule fois.

Remarque : Pour le constructeur de la sous-classe, que le constructeur prenne ou non des paramètres, par défaut, il recherchera d'abord le constructeur de la classe parent sans paramètres. Si la classe parent n'a pas de constructeur sans paramètres, la sous-classe doit utiliser la clé supper pour appeler le constructeur de la classe parent avec des paramètres, sinon la compilation échouera.

Mécanisme de recyclage GC

Le garbage collector en Java peut récupérer automatiquement la mémoire occupée par les objets inutiles, mais il est uniquement responsable de libérer toute la mémoire occupée par les objets créés en Java, l'espace mémoire alloué à l'objet via une méthode autre que la création de l'objet ne peut pas être récupéré par le garbage collector ; et le garbage collection lui-même a également une surcharge, et la priorité de GC est relativement faible, donc si la JVM n'est pas confrontée épuisement de la mémoire, ce ne sera pas le cas. Les ressources seront gaspillées pour le garbage collection afin de restaurer la mémoire. Enfin, nous constaterons que tant que le programme n’est pas sur le point de manquer d’espace de stockage, l’espace occupé par l’objet ne sera jamais libéré. Nous pouvons démarrer activement un garbage collector via le code System.gc() (bien que la JVM ne le recyclera pas immédiatement). Avant de libérer l'espace mémoire alloué par new, l'espace mémoire alloué par d'autres méthodes sera libéré via finalize().

Quelle mémoire doit être recyclée

Tas Java, mémoire de la zone de méthode

Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)

Quand recycler

  1. Comptage de références

Ajoute un compteur de référence à un objet Chaque fois qu'il y a un endroit qui le référence, le compteur plus un. En revanche, chaque fois qu'une référence devient invalide, le compteur est décrémenté de un. Lorsque le compteur est à 0, cela signifie que l'objet n'est pas référencé. Par exemple :
Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)
Cependant, la méthode de comptage de références ne peut pas résoudre les références circulaires entre les objets, voir l'exemple suivant
Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)
  1. Analyse d'accessibilité

Établir plusieurs objets racine (GC Root), chaque objet est un nœud enfant Lorsqu'un objet ne trouve pas la racine, l'objet est considéré comme inaccessible. .
Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)
Il n'y a pas de chemin depuis la racine vers Object4 et Object5, ce qui indique que ces deux objets sont inaccessibles depuis la racine et peuvent être recyclés. En Java, les objets pouvant être utilisés comme racines GC incluent : les objets référencés dans la pile de machines virtuelles Java ; les objets référencés par des variables statiques dans la zone de méthode ; les objets référencés par des constantes dans la zone de méthode ;

Comment recycler

  1. Marque - algorithme d'effacement

Marquez d'abord tous les objets qui doivent être recyclés, et une fois le marquage terminé, tous les objets marqués seront recyclés uniformément.
Cet algorithme présente deux problèmes : 1) Le processus de marquage et d'effacement n'est pas efficace. Principalement parce que le garbage collector doit parcourir tous les objets accessibles à partir de l'objet racine GC Roots et ajouter une marque à ces objets pour indiquer que cet objet est ignoré pendant le nettoyage. Ensuite, pendant la phase de nettoyage, le garbage collector démarrera à partir du tas Java. est parcouru du début à la fin. Si un objet n'est pas marqué, l'objet sera effacé. Évidemment, l'efficacité du parcours est très faible ; 2) De nombreux fragments d'espace discontinus seront générés, donc lorsqu'un objet plus grand doit être alloué pendant l'exécution du programme, il ne sera peut-être pas en mesure de trouver suffisamment de mémoire et devra démarrer une collecte des ordures à l'avance.
  1. Algorithme de copie

Divise la mémoire en deux blocs et n'utilise qu'un seul bloc à la fois. Lorsque ce bloc de mémoire est plein, les objets survivants sont copiés dans un autre bloc et disposés strictement en fonction de l'adresse mémoire, puis le bloc de mémoire utilisé est recyclé uniformément.
L'avantage est : il peut obtenir un espace mémoire continu
L'inconvénient est : la moitié de la mémoire est gaspillée
La JVM moderne ne divise pas l'espace mémoire selon 1:1, mais divise la mémoire en un plus grand La zone Eden et deux zones Survivant plus petites, Eden et une zone Survivant, sont utilisées à chaque fois. Lors du recyclage, copiez immédiatement les objets survivants d'Eden et Survivor sur un autre Survivant, et enfin nettoyez l'espace dans Eden and Survivor. En fait, il y a une autre question ici : et si après le ramasse-miettes, l'espace requis par les objets survivants était supérieur à l'espace restant du survivant ? La réponse est qu'il doit s'appuyer sur une autre mémoire pour l'allocation (il s'agit ici principalement de l'ancienne génération).
  1. Algorithme de marquage-organisation

Le processus est le même que l'algorithme de marquage-effacement, sauf que la zone mémoire non marquée n'est pas nettoyée après marquage. La seconde consiste à déplacer tous les objets survivants vers une extrémité, puis à nettoyer la mémoire en dehors de la limite
  1. Algorithme de génération

L'algorithme de génération. algorithme dit générationnel Il divise la mémoire en plusieurs blocs en fonction du cycle de vie de l'objet, afin que l'algorithme de garbage collection approprié puisse être sélectionné en fonction de « l'âge » de l'objet. En Java, les objets en mémoire sont répartis selon leur durée de vie : 1. Nouvelle génération : cycle de vie court, comme les variables locales ; 2. Ancienne génération : objets à cycle de vie long ; 3. Génération permanente : rarement recyclée, cycle de vie long ; , comme les informations de classe chargées.
La nouvelle génération et l'ancienne génération sont stockées dans la zone du tas, et la génération permanente est stockée dans la zone des méthodes. Les objets volumineux entreront directement dans l'ancienne génération, comme les chaînes très longues ou les grands tableaux, ce qui est une mauvaise nouvelle pour l'allocation de mémoire JVM, car les objets volumineux doivent trouver de la mémoire contiguë, sinon le GC sera déclenché, donc les objets volumineux de courte durée le seront. nécessaire Essayez de l'éviter. Les objets qui ont survécu longtemps entrent dans l'ancienne génération. Chaque fois qu'un objet subit un gc mineur dans la nouvelle génération, son âge est augmenté de 1. Par défaut, il entrera dans l'ancienne génération lorsqu'il atteindra 15 ans. Lors de chaque GC mineur, la machine virtuelle détecte si la taille moyenne promue vers l'ancienne génération est supérieure à la taille restante actuelle de l'ancienne génération. Si elle est plus petite, un GC complet est effectué.
La nouvelle génération utilise un algorithme de copie (car il y a moins d'objets survivants et trop d'objets morts. Si vous utilisez l'algorithme mark-sweep, vous devez parcourir les marques, ce qui est évidemment moins efficace. Cependant, en utilisant la copie L'algorithme peut enregistrer les objets survivants. Copiez moins d'objets dans la zone de mémoire disponible, donc l'efficacité est plus élevée) pour le recyclage GC. Parce que l'ancienne génération a un taux de survie élevé, elle utilise un algorithme d'effacement des marques ou de tri des marques pour le recyclage.

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