


Analyse du mécanisme de mémoire Java et du mécanisme de recyclage GC (introduction image et texte)
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
Gestion de la mémoire Java
Division du modèle de mémoire java
Accès au positionnement des objets
Object obj = new Object();
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
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
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)
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)
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
Quand recycler
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 :
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 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. .
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
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.
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).
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
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4
