


Explication détaillée du mécanisme de récupération de place Java et exemple de code
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; }
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>>(); if(read_elements(n, elements) < n) { return -1; } return 0; }
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)
- 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) !

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)

Sujets chauds

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.

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 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.

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
