Maison >Java >javaDidacticiel >Résumé des méthodes et principes du garbage collector Java
Qu'est-ce que le garbage collector Java ?
Le garbage collector Java est l'un des trois modules importants de la machine virtuelle Java (JVM) (les deux autres sont l'interpréteur et le multi-threading mécanisme). L'application fournit des fonctions d'allocation automatique de mémoire (Memory Allocation) et de recyclage automatique (Garbage Collect). Les deux opérations se produisent sur le tas Java (un bloc de mémoire). À un moment donné, si un objet a plus d'une référence (Rreference) pointant vers lui, alors l'objet est vivant (Live), sinon il est mort (Dead) et est considéré comme un déchet et peut être recyclé et réutilisé par le éboueur. Les opérations de garbage collection consomment des ressources telles que le processeur, les threads et le temps, il est donc facile de comprendre que les opérations de garbage collection ne se produisent pas en temps réel (les objets sont libérés immédiatement après la mort lorsque la mémoire est consommée ou qu'un certain indicateur est atteint). (Seuil, la mémoire utilisée représente le taux de mémoire total, tel que 0,75), l'opération de garbage collection est déclenchée. Il existe une exception pour la mort d'un objet Même si l'objet de type java.lang.Thread n'a pas de référence, il ne sera pas recyclé tant que le thread est toujours en cours d'exécution.
Mécanisme de recyclage
Selon l'analyse statistique, la plupart des objets en Java (y compris certains autres langages de haut niveau) ont un cycle de vie court, donc la mémoire Java est gérée en générations. Le but de la génération générationnelle n'est rien d'autre que d'utiliser différentes stratégies de gestion (algorithmes) pour les blocs de mémoire de différentes générations afin de maximiser les performances. Par rapport à l'ancienne génération, la jeune génération est généralement beaucoup plus petite, la fréquence de recyclage est élevée et la vitesse est rapide. L'ancienne génération a une faible fréquence de recyclage et prend beaucoup de temps. La mémoire est allouée dans la jeune génération. Les objets de la jeune génération qui survivent encore après plusieurs cycles de recyclage seront automatiquement promus à l'ancienne génération.
Choix de conception
Les choix de conception affectent la difficulté de mise en œuvre du garbage collector JVM et les indicateurs de performance de la JVM, applicables pour différents scénarios. Décrit les caractéristiques de style de l'algorithme de recyclage.
Recyclage série monothread VS recyclage parallèle multithread
La question de savoir si l'opération de recyclage elle-même est multithread. Les avantages du recyclage mono-thread sont qu’il est simple, facile à mettre en œuvre, qu’il présente moins de fragmentation et qu’il convient aux machines monocœur. Le recyclage parallèle multithread peut utiliser pleinement les ressources CPU sur les machines multicœurs, réduire le temps de recyclage et augmenter la productivité. L'inconvénient est qu'il est compliqué et que certains fragments peuvent ne pas être recyclés.
Pause du thread d'application pendant le recyclage VS Le recyclage et l'application sont effectués simultanément
La question de savoir s'il faut mettre en pause le thread d'application pendant l'opération de recyclage. Les avantages de la pause du thread d'application sont la simplicité, la précision, un nettoyage relativement propre et un temps de nettoyage court (les ressources CPU sont exclusives). L'inconvénient est que la pause du thread d'application entraînera une prolongation du temps de réponse de l'application pendant le cycle de récupération de place. et les performances en temps réel sont très élevées. Le système est relativement sensible. L'avantage du traitement parallèle des threads de recyclage et d'application est que le temps de réponse de l'application est relativement stable, mais les inconvénients sont qu'il est difficile à mettre en œuvre, la fréquence de nettoyage est élevée et il peut y avoir des fragments.
Ne pas fusionner les segments de mémoire libérés VS fusionner les segments de mémoire libérés VS copier ceux en direct vers un nouvel endroit
Ces trois options décrivent comment gérer les fragments de blocs de mémoire morts. Les fragments de mémoire morts sont généralement dispersés dans tout le tas. S'ils ne sont pas gérés, il y aura deux problèmes : l'allocation de mémoire sera lente en raison de la recherche de mémoire disponible, ce qui entraînera un gaspillage de mémoire (comme les besoins d'un grand tableau). segments de mémoire contigus). Il existe deux manières de gérer : déplacer la mémoire vive vers une extrémité du bloc mémoire et enregistrer la position de départ de la mémoire disponible, ou simplement copier la mémoire vive vers une nouvelle zone mémoire, en laissant le bloc mémoire d'origine vide.
Metriques de performance
①, Productivité (Débit)
Sur une période plus longue (une longue période est significative), le ratio de matières non recyclées temps au temps total. Mesure l’efficacité opérationnelle du système.
②, Garbage Collection Overhead (Garbage Collection Overhead)
Le rapport entre le temps de recyclage et le temps total sur une période plus longue. Correspond à la productivité, qui totalise 100 %.
③, Temps de pause
Lorsque la machine virtuelle Java recycle les déchets, certains algorithmes suspendent l'exécution de tous les threads d'application. Dans certains systèmes, cela peut être sensible. l'intervalle de pause.
④, Fréquence de collecte
Combien de temps faut-il en moyenne pour que les opérations de recyclage aient lieu.
⑤. Taille de la mémoire occupée (empreinte)
Comme la taille du tas.
⑥, Temps réel (Promptness)
Combien de temps faut-il pour que la mémoire occupée par l'objet soit recyclée depuis la mort d'un objet.
Types de collecte des déchets
Tous les types de collecteurs sont basés sur une technologie générationnelle. La machine virtuelle Java HotSpot contient trois générations : jeune génération, ancienne génération et génération permanente.
①La génération permanente
stocke les classes, les méthodes et leurs informations de description. Vous pouvez spécifier la taille initiale et la valeur maximale via les deux options facultatives -XX:PermSize=64m et -XX:MaxPermSize=128m. Habituellement, nous n'avons pas besoin d'ajuster ce paramètre. La taille de génération permanente par défaut est suffisante. Cependant, s'il y a trop de classes chargées et que ce n'est pas suffisant, ajustez simplement la valeur maximale.
②Ancienne Génération
Stocke principalement les objets de la jeune génération qui survivent à plusieurs cycles de recyclage et sont mis à niveau. Bien entendu, pour certaines allocations de mémoire importantes, ils peuvent également être alloués directement à la génération permanente (un exemple extrême est que la jeune génération ne peut pas être stockée). du tout).
③Jeune génération
La grande majorité des actions d'allocation de mémoire et de recyclage ont lieu chez la jeune génération. Comme le montre la figure ci-dessous, la jeune génération est divisée en trois zones, la zone d'origine (Eden) et deux petites zones de survie (Survivor). Les deux zones de survie sont divisées en From et To selon leurs fonctions. La grande majorité des objets sont alloués dans la zone d'origine, et les objets qui survivent à plus d'une opération de ramassage des déchets sont placés dans la zone de survie.
Collecteur série
Un seul thread effectue une opération de recyclage, suspendant l'exécution de tous les threads d'application pendant le recyclage, en mode client Le collecteur par défaut est forcé à spécifier par l'option de ligne de commande -XX:UseSerialGC.
① Algorithme de recyclage jeune génération (Minor Collection)
Déplacez les objets survivants de la zone Eden vers la zone To. Si la zone To ne peut pas y rentrer, déplacez-la directement vers. l'ancienne génération. Déplacez la zone De vers l'ancienne génération. Ceux qui sont trop âgés seront déplacés vers la zone Vers. Si la zone Vers ne peut pas y entrer, ils seront déplacés directement vers l'ancienne génération. dans la zone From sera mis à niveau vers l’ancienne génération. Une fois le recyclage terminé, les zones Eden et From sont vides. À ce stade, les fonctions From et To sont interchangées, From devient To et To devient From. Avant chaque cycle de recyclage, To est vide. La sélection de conception est une copie.
②Algorithme de recyclage de l'ancienne génération (Collection complète)
Le recyclage de l'ancienne génération est divisé en trois étapes, Mark, Sweep et Compact). La phase de marquage marque tous les objets vivants, la phase de nettoyage libère tous les objets morts et la phase de fusion fusionne tous les objets vivants dans la partie avant de l'ancienne génération, laissant tous les segments libres à l'arrière. La sélection de conception fusionne pour réduire la fragmentation de la mémoire.
Parallel Collector
Utilisez plusieurs threads pour effectuer le garbage collection en même temps Dans un environnement multicœur, vous pouvez utiliser pleinement les ressources du processeur, réduire le temps de recyclage et. augmenter la productivité JVM Serveur Le collecteur par défaut en mode. Comme pour le collecteur série, l'exécution de tous les threads d'application est suspendue pendant la collecte. Forcé par l'option de ligne de commande -XX:UseParallelGC.
① Algorithme de collecte de jeune génération (Collection mineure)
Utilisez plusieurs threads pour collecter les déchets, et l'algorithme de chaque thread est le même que celui du collecteur en série.
②Algorithme de recyclage ancienne génération (Collection complète)
L'ancienne génération est toujours monothread, le même que le collecteur série.
Collection de compactage parallèle
La collection de la jeune génération et de l'ancienne génération est traitée par multi-threading. Spécifié par l'option de commande -XX : UseParallelOldGC, -XX:ParallelGCThreads=3 peut spécifier davantage le nombre de threads participant au recyclage parallèle. Comme pour le collecteur série, l'exécution de tous les threads d'application est suspendue pendant la collecte. Par rapport au collecteur parallèle, le temps de collecte de l'ancienne génération est plus court, réduisant ainsi l'intervalle de temps de pause (Pause time). Forcé par l'option de ligne de commande –XX : UseParallelOldGC.
①L'algorithme de collecte de la jeune génération (Minor Collection)
Le même que le collecteur parallèle (Parallel Collector)
②L'algorithme de collecte de l'ancienne génération ( Collection complète) )
L'ancienne génération est divisée en trois étapes, le marquage, les statistiques et la fusion. L’idée de division est utilisée ici pour diviser l’ancienne génération en plusieurs régions de taille fixe. Dans la phase de marquage, tous les objets survivants sont divisés en N groupes (qui doivent être identiques au nombre de threads de recyclage). Chaque thread est indépendamment responsable de son propre groupe, marquant l'emplacement des objets survivants et les informations sur le taux de survie de ceux-ci. la région (Région), marquée comme Parallèle. Dans la phase statistique, le taux de survie de chaque région est compté. En principe, le taux de survie à l'avant est plus élevé. De l'avant vers l'arrière, trouvez la position de départ qui mérite d'être fusionnée (les régions où la plupart des objets sont vivants ne valent pas la peine d'être fusionnées). Phase de statistiques Est série (un seul thread). Dans la phase de fusion, sur la base des informations de la phase statistique, plusieurs threads copient les objets survivants d'une région (Région) vers une autre région (Région) en parallèle.
Collecteur Mark-Sweep simultané
Également connu sous le nom de collecteur à faible latence, il utilise divers moyens pour créer des applications. Le programme est suspendu pour la durée la plus courte. Les opérations de recyclage sont essentiellement effectuées simultanément avec l'application, sans opérations de fusion ni de copie. Spécifiez via la ligne de commande -XX : UseConcMarkSweepGC. Dans les systèmes monocœur ou double cœur, vous pouvez également spécifier le mode de recyclage incrémentiel -XX : UseConcMarkSweepGC. Le recyclage incrémentiel fait référence à la division de l'opération de recyclage en plusieurs fragments, à la libération des ressources CPU vers l'application après l'exécution d'un fragment et à la poursuite du recyclage du dernier résultat à un certain moment dans le futur. Le but est également de réduire les délais.
①L'algorithme de collecte de la jeune génération (Minor Collection)
Le même que le collecteur parallèle (Parallel Collector)
②L'algorithme de collecte de l'ancienne génération ( Collection complète) )
est divisé en quatre étapes : marque initiale, marque simultanée, remarque et balayage simultané. Notez notamment qu’il n’y a pas d’opération de fusion, il y aura donc fragmentation.
Phase d'initialisation : mettez en pause le thread de l'application et recherchez tous les objets survivants. Cela prend peu de temps et le recycleur utilise un seul thread.
Phase de marquage simultané : l'opération de marquage du collecteur s'exécute simultanément avec l'application et le collecteur utilise un seul thread pour marquer les objets vivants.
Marquer à nouveau : Pendant la phase de marquage simultané, puisque l'application est également en cours d'exécution, des objets peuvent être ajoutés ou modifiés au cours de ce processus. Mettez donc à nouveau le thread d'application en pause, recherchez tous les objets modifiés et utilisez le marquage multi-thread.
Nettoyage simultané : l'opération de nettoyage du collecteur s'exécute en même temps que l'application et le collecteur utilise un seul thread pour nettoyer les objets morts.
Outil d'évaluation des performances du garbage collector Java
①–XX : PrintGCDetails et –XX : PrintGCTimeStamps
Heure de début du garbage collection, durée , mémoire libre de chaque génération et d'autres informations.
②jmap [options] pid
jamp 2043 Afficher les objets partagés chargés dans le processus 2043. Généralement des fichiers DLL.
jmap -heap 2043 Afficher les informations de configuration et l'utilisation du tas de mémoire.
jmap -permstat 2043 Vérifiez l'état de chargement de la génération permanente.
jmap -histo 2043 Vérifiez le chargement et l'utilisation de la mémoire des classes.
③jstat [options] pid
jstat -class 2043 chargement, déchargement, utilisation de la mémoire.
jstat -gc 2043 État d'exécution du GC.
Postscript
Java fournit des fonctions de sélection automatique et d'optimisation automatique des performances. Avant de régler le garbage collector, répertoriez d'abord les indicateurs de performances qui vous préoccupent et indiquez à la JVM les indicateurs de performances qui vous préoccupent via la ligne de commande. La JVM le réglera automatiquement. Si vous n'êtes pas satisfait, vous pouvez spécifier le garbage collector. . OutOfMemory est généralement dû à une mémoire de tas insuffisante. Ajustez simplement les options de ligne de commande -Xmx1024m et -XX:MaxPermSize=128m.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.
Pour plus d'articles sur les méthodes et principes du garbage collector Java, veuillez faire attention au site Web PHP chinois !