Maison Java javaDidacticiel Explication détaillée du mécanisme de récupération de place Java et exemple de code

Explication détaillée du mécanisme de récupération de place Java et exemple de code

Mar 06, 2017 am 10:11 AM

Cet article présente principalement l'explication détaillée du mécanisme de récupération de place Java et les informations pertinentes de l'exemple de code. Les amis qui en ont besoin peuvent se référer à

Explication détaillée du mécanisme de récupération de place Java

À première vue, le ramassage des déchets devrait faire exactement ce que son nom l'indique : trouver et éliminer les déchets. En fait, c'est tout le contraire. Le garbage collection garde une trace de tous les objets encore utilisés et marque les objets restants comme des déchets. Dans cet esprit, examinons de plus près comment ce recyclage automatisé de la mémoire appelé « garbage collection » est implémenté dans la JVM.

Gestion manuelle de la mémoire

Avant de présenter la version moderne du garbage collection, passons brièvement en revue l'époque où la mémoire devait être explicitement allouée et libérée manuellement. Si vous oubliez de libérer la mémoire, cette mémoire ne pourra pas être réutilisée. Cette mémoire est occupée mais non utilisée. Ce scénario est appelé fuite de mémoire.

Ce qui suit est un exemple simple de gestion manuelle de la mémoire écrite en C :

int send_request() {
  size_t n = read_size();
  int *elements = malloc(n * sizeof(int));

  if(read_elements(n, elements) < n) {
    // elements not freed!
    return -1;
  }

  // …

  free(elements)
  return 0;
}
Copier après la connexion

Comme vous pouvez le voir, vous pouvez facilement oublier pour libérer la mémoire. Les fuites de mémoire étaient un problème très courant. Vous ne pouvez les combattre qu'en corrigeant constamment votre code. Par conséquent, il est nécessaire de trouver un moyen plus élégant de libérer automatiquement la mémoire inutilisée afin de réduire le risque d’erreur humaine. Ce processus automatisé est également appelé garbage collection (GC en abrégé).

Pointeurs intelligents

Une des premières mises en œuvre de la collecte automatique des déchets est le comptage de références. Vous savez combien de fois chaque objet a été référencé. Lorsque le compteur atteint 0, l'objet peut être recyclé en toute sécurité. Le pointeur partagé de C est un exemple très célèbre :

int send_request() {
  size_t n = read_size();
  stared_ptr<vector<int>> elements 
       = make_shared<vector<int>&gt();

  if(read_elements(n, elements) < n) {
    return -1;
  }

  return 0;
}
Copier après la connexion

Le sharedptr que nous utilisons enregistrera le nombre de fois que cet objet est référencé. Le nombre est incrémenté de un si vous le transmettez à quelqu'un d'autre, et décrémenté de un lorsqu'il est hors de portée. Une fois que ce nombre atteint 0, sharedptr supprimera automatiquement le vecteur correspondant sous-jacent. Bien sûr, ce n’est qu’un exemple, car certains lecteurs ont souligné qu’il est peu probable que cela se produise dans la réalité, mais cela suffit à titre de démonstration.

Gestion automatique de la mémoire

Dans le code C ci-dessus, nous devons également indiquer explicitement que nous devons utiliser la gestion de la mémoire. Alors que se passerait-il si tous les objets utilisaient ce mécanisme ? C'est tellement pratique que les développeurs n'ont pas à penser à nettoyer la mémoire. Le runtime saura automatiquement quelle mémoire n’est plus utilisée et la libérera. En d’autres termes, il recycle automatiquement les déchets. Le garbage collector de première génération a été introduit en Lisp en 1959, et la technologie a continué d'évoluer jusqu'à ce jour.

Comptage de références

L'idée que nous venons de démontrer en utilisant le pointeur partagé de C peut être appliquée à tous les objets. De nombreux langages, tels que Perl, Python et PHP, utilisent cette approche. Cela peut être facilement expliqué avec une image :

Le nuage vert représente les objets encore utilisés dans le programme. D'un point de vue technique, c'est un peu comme une variable locale dans une méthode en cours d'exécution, ou une variable statique. La situation peut varier selon les langages de programmation, ce n’est donc pas notre objectif.

Les cercles bleus représentent les objets en mémoire et vous pouvez voir combien d'objets y font référence. Les objets entourés de cercles gris ne sont plus référencés par personne. Par conséquent, ce sont des objets poubelles et peuvent être nettoyés par le ramasse-miettes.

Ça a l'air bien, non ? Oui, mais il y a un défaut majeur. Il est facile d'apparaître des anneaux isolés. Les objets qu'ils contiennent ne appartiennent à aucun domaine, mais ils se réfèrent les uns aux autres, ce qui donne un numéro de référence non nul. Voici un exemple :

Comme vous pouvez le constater, la partie rouge est en fait un objet poubelle qui n'est plus utilisé par l'application. En raison d'un défaut dans le comptage de références, il y aura une fuite de mémoire.

Il existe plusieurs façons de résoudre ce problème, comme utiliser des références spéciales "faibles", ou utiliser un algorithme spécial pour recycler les références circulaires. Les langages mentionnés précédemment tels que Perl, Python et PHP utilisent tous des méthodes similaires pour recycler les références circulaires, mais cela dépasse le cadre de cet article. Nous allons présenter en détail la méthode utilisée par la JVM.

Marquer la suppression

Tout d'abord, la définition de l'accessibilité des objets par la JVM doit être plus claire. Il n'est pas aussi vague qu'avant avec un nuage vert, mais a une définition très claire et spécifique de l'objet racine du garbage collection (Garbage Collection Roots) :

  • Variables locales

  • Fil d'activité

  • Champs statiques

  • Référence JNI

  • D'autres (seront discutés plus tard)


JVM enregistre tous les objets accessibles (survie) via l'algorithme de marquage et de suppression, tout en garantissant que la mémoire des objets inaccessibles peut être réutilisée. Cela se compose de deux étapes :

  • Le marquage fait référence au parcours de tous les objets accessibles, puis à l'enregistrement des informations de ces objets dans la mémoire locale

  • Suppression Garantira que l’adresse mémoire de l’objet inaccessible pourra être utilisée lors de la prochaine allocation de mémoire.


Différents algorithmes GC dans la JVM, tels que Parallel Scavenge, Parallel Mark Copy et CMS sont tous des implémentations différentes de cet algorithme, mais chaque étape est légèrement différente sur le plan conceptuel, elles correspondent toujours. deux étapes mentionnées ci-dessus.

La chose la plus importante à propos de cette implémentation est qu'il n'y aura plus de fuites de boucles d'objets :

L'inconvénient est que le thread d'application doit être suspendu pour terminer le recyclage si la référence est conservée. en changeant, vous êtes incapable de compter. La situation dans laquelle l'application est mise en pause afin que la JVM puisse s'occuper de ses tâches est également connue sous le nom de pause Stop The World (STW). Il existe de nombreuses possibilités pour déclencher cette pause, mais le garbage collection est probablement la plus courante.

Ce qui précède est une explication détaillée du mécanisme de récupération de place Java et un exemple de code. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

Guide de la racine carrée en Java. Nous discutons ici du fonctionnement de Square Root en Java avec un exemple et son implémentation de code respectivement.

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

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.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

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.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

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.

Numéro Armstrong en Java Numéro Armstrong en Java Aug 30, 2024 pm 04:26 PM

Guide du numéro Armstrong en Java. Nous discutons ici d'une introduction au numéro d'Armstrong en Java ainsi que d'une partie du code.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

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.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

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.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

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

See all articles