Maison  >  Article  >  Java  >  Explication détaillée de plusieurs principes de garbage collection en Java

Explication détaillée de plusieurs principes de garbage collection en Java

伊谢尔伦
伊谢尔伦original
2017-04-29 13:27:371768parcourir

En Java, à l'exception des types de base tels que les entiers et les références, tous les objets sont alloués dans la zone de tas au lieu de la zone de pile. Cette conception élimine le besoin pour les programmeurs de prêter attention au cycle de vie des variables, mais au prix de générer davantage de déchets.

Accessibilité

Les données auxquelles le programme peut accéder directement en déréférençant n'importe quel pointeur sont accessibles.

Principe de localité

Si l'emplacement de stockage d'un programme est susceptible d'être consulté à nouveau dans un court laps de temps, on dit que le programme a une localité temporelle. Un programme est localisé spatialement si un emplacement proche d'un emplacement mémoire consulté est susceptible d'être accédé dans un court laps de temps.

On pense généralement qu'un programme passe 90% de son temps à exécuter 10% du code.

Les principes de plusieurs ramasse-miettes

Collecteur de marquage par balayage

Ce collecteur parcourt d'abord le graphe d'objets et marque les objets accessibles, puis analyse la pile pour trouver les objets non marqués objets et libérer leur mémoire. Ce type de collecteur utilise généralement un seul thread pour fonctionner et arrête les autres opérations. De plus, comme il efface uniquement les objets non marqués et ne compresse pas les objets marqués, il générera beaucoup de fragmentation de la mémoire, gaspillant ainsi de la mémoire.

Mark-Compact Collector

Parfois aussi appelé Mark-Sweep-Compact Collector, il possède la même phase de marquage que le Mark-Sweep Collector. Dans un deuxième temps, l'objet marqué est copié dans une nouvelle zone de la pile afin de compresser la pile. Ce collecteur arrête également d'autres opérations.

Collecteur de copie

Ce collecteur divise la pile en deux domaines, souvent appelés demi-espaces. Seule la moitié de l'espace est utilisée à chaque fois, et les nouveaux objets générés par la JVM sont placés dans l'autre moitié de l'espace. Lorsque le GC s'exécute, il copie les objets accessibles dans l'autre moitié de l'espace, compressant ainsi la pile. Cette méthode convient aux objets à courte durée de vie. La copie continue d'objets à longue durée de vie entraînera une efficacité réduite. Et pour un tas de taille donnée, deux fois plus de mémoire est nécessaire car seule la moitié de celle-ci est utilisée à tout moment.

Collecteur incrémental

Le collecteur incrémentiel divise la pile en plusieurs domaines et ne collecte les déchets d'un domaine à la fois. Cela peut également être compris comme la division de la pile en petits morceaux, un seul. le bloc est collecté à la fois. Cela entraîne un faible temps d'interruption de l'application, de sorte que l'utilisateur ne se rend généralement pas compte que le ramasse-miettes fonctionne.

Principe de recyclage partiel

Habituellement, 80 à 90 % des objets nouvellement attribués se trouvent dans quelques millions d'instructions ou sont réaffectés.

Coolection générationnelle des déchets

Elle est basée sur le principe du collecteur de copies et du recyclage partiel.

Un moyen efficace de profiter de la propriété « mourir jeune » de la plupart des objets.

Divisez le tas en une série de petites zones et numérotez-les avec 0, 1, 2...n. Plus le nombre est petit, plus l'objet stocké dans la zone est jeune. Zone 0. Après la création, les déchets sont collectés après remplissage et les objets accessibles sont déplacés vers la zone 1. Chaque cycle de récupération de place est effectué pour la zone avec un numéro de série inférieur ou égal à i, où i est le nombre le plus élevé. de la zone actuellement occupée.

Tant que je suis recyclé, toutes les zones portant le numéro de série i seront également collectées. En effet, les jeunes générations ont tendance à contenir plus de déchets, ce qui signifie qu'ils sont recyclés plus fréquemment.

La génération la plus ancienne sauve les objets les plus matures, et le recyclage de ces objets est le plus coûteux, équivalent à un recyclage complet. Peut provoquer des pauses plus longues. La solution consiste à utiliser l'algorithme de train.

Les quatre collecteurs GC de HotSpot :
Collecteur série :
Caractéristiques : L'application sera mise en pause pendant le recyclage.
Zone Jeune : Combinez Eden et une zone Survivant. Les objets survivants sont copiés dans une autre zone Survivant. (défini sur TO) (les gros objets sont placés directement dans l'ancienne zone). Si la zone TO est pleine, ils sont copiés directement dans l'ancienne zone : utilisez l'algorithme GC mark-sweep-compact, c'est-à-dire. , marquez d'abord les objets survivants, puis effacez les objets mis au rebut, puis déplacez les objets survivants vers une zone pour libérer un espace libre plus grand
Champ d'application : la plupart des applications clientes peuvent utiliser ce type d'algorithme de recyclage, c'est le cas. également l'algorithme de recyclage par défaut de HotSpot. Sur la machine actuelle (2006), un recyclage complet d'une zone de 64 Mo prend moins d'une demi-seconde

Collecteur parallèle de recyclage parallèle :
Caractéristiques : Multi. -core CPU peut être utilisé.
Zone jeune : l'application doit encore être mise en pause. Le mécanisme de base est similaire à la sérialisation, mais le multithreading est utilisé.
Ancienne zone : même chaîne. Linéarisation.
Peut être utilisé sur des ordinateurs multicœurs.

Collecteur à compactage parallèle :
Par rapport au recyclage parallèle, il dispose principalement d'un nouvel algorithme dans l'ancienne zone. En même temps, selon le livre blanc, ce type de recyclage remplacera à terme le recyclage parallèle.
Zone jeune : Identique au recyclage parallèle.
zone ancienne : Tout d'abord, divisez les anciennes en plusieurs zones consécutives. Ensuite, vérifiez chaque zone en parallèle et marquez les objets vivants (marquez d'abord les objets pouvant être directement référencés, puis tous). Commencez ensuite à vérifier ces zones pour obtenir la densité (la zone de gauche est nettement plus dense que la zone de droite), en partant d'une région peu dense, et compressez la zone de droite en parallèle
Champ d'application. : Pour les environnements avec des exigences multicœurs et de temps de pause, il est préférable d'utiliser la compression et le recyclage parallèles plutôt que le recyclage parallèle. Cependant, pour les serveurs avec des taux de partage élevés (c'est-à-dire qu'un serveur exécute plusieurs applications), en raison de l'ancienne zone. la collecte est lente et multithread, donc le GC d'une application affectera les autres applications. La solution correspondante : vous pouvez configurer pour réduire le nombre de threads en parallèle.

Collecteur Concurrent Mark Sweep :
Jeune. zone : identique au recyclage parallèle.
Ancienne zone : divisée en plusieurs étapes
Initialmark : lorsque GC doit être exécuté, mettez d'abord l'application en pause, puis marquez tous les objets directement référencés.
Concurrentmark : continuez ensuite. l'application et vérifiez les objets marqués en même temps pour obtenir tous les objets survivants.
remarque : mettez à nouveau l'application en pause et vérifiez les objets modifiés par l'application pendant la durée de la marque simultanée (nouveau, abandonné), et marquez les survivants. objets. Cette phase dure longtemps, donc le multithread est utilisé. Une fois la phase terminée, tous les objets survivants sont marqués et les objets non marqués sont des objets poubelles.
sweep : arrêtez de mettre l'application en pause, puis relâchez-la. espace de tous les objets poubelles.

Différences par rapport aux autres algorithmes :
Premièrement : aucune compression n'est effectuée. Cependant, elle sera calculée en calculant les besoins possibles en mémoire dans le futur. blocs de mémoire.
Deuxièmement : le GC n'est exécuté que lorsque l'ancienne zone est pleine, mais démarre lorsque l'espace est inférieur à un certain niveau.
Troisièmement : Puisque la compression n'est pas effectuée, une fragmentation se produira
.
De plus, CMS peut également utiliser un fonctionnement incrémental, ce qui signifie n'effectuer qu'une partie du travail pendant la phase Concurrentmark, puis restituer les ressources à l'application. Le travail du recycleur sera divisé en plusieurs parties et organisé en deux. jeune La phase d'inactivité du recyclage régional est terminée. Ce mode est généralement utilisé lorsqu'un temps de pause est requis et que le nombre de processeurs n'est pas important (single-core ou dual-core
De manière générale, par rapport au recyclage parallèle, CMS). est réduit Réduit le temps de pause des anciens GC (parfois l'effet est très important), allonge légèrement le temps des jeunes GC (car le temps de déplacement des objets de la zone jeune vers l'ancienne zone sera plus long : aucune compression n'est effectuée, il faut donc d'abord trouver une zone appropriée), la réduction améliore une certaine efficacité d'exécution de l'ensemble du système et augmente considérablement la demande d'espace mémoire.

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