Qu'est-ce qu'un collecteur de déchets Java
Le collectionneur Java Garbage est l'un des trois modules importants de la machine virtuelle Java (JVM) (les deux autres sont des interprètes et des mécanismes multi-thread). Il fournit aux applications des fonctions d'allocation de mémoire automatique (allocation de mémoire) et de collection de mémoire automatique (collecte de déchets). Les deux opérations se produisent sur le tas Java (un morceau de mémoire est rapide). À un certain moment, si un objet a plus d'une référence pointant vers lui, alors l'objet est en direct. Sinon, il sera considéré comme des ordures et peut être recyclé et réutilisé par le collecteur des ordures. Les opérations de collecte des ordures nécessitent un processeur, des fils, du temps et d'autres ressources, il est donc facile de comprendre que les opérations de collecte des ordures ne se produisent pas en temps réel (l'objet est libéré immédiatement après la mort). Lorsque la mémoire est consommée ou qu'un certain indicateur est atteint (seuil, le rapport de la mémoire à la mémoire totale est utilisé, tel que 0,75), l'opération de collecte des ordures est déclenchée. Il y a une exception à la mort d'un objet. Même si un objet de type java.lang.thread n'est pas référencé, tant que le thread est toujours en cours d'exécution, il ne sera pas recyclé.
Mécanisme de recyclage
Selon l'analyse statistique, la plupart des objets en Java (y compris d'autres langues de haut niveau) ont des cycles de vie courts, de sorte que la mémoire Java est gérée en générations. Le but de la division générationnelle n'est rien de plus que d'utiliser des stratégies de gestion différentes (algorithmes) pour les blocs de mémoire de différentes générations pour maximiser les performances. Par rapport à la génération plus âgée, la jeune génération est généralement beaucoup plus petite et la fréquence de recyclage est élevée et la vitesse est rapide. Les personnes âgées ont une faible fréquence de recyclage et prennent beaucoup de temps. La mémoire est distribuée dans la jeune génération. Les objets de la jeune génération seront automatiquement promus dans l'ancienne génération après plusieurs cycles de recyclage.
Choix de conception
La sélection de conception affecte la difficulté de mise en œuvre de JVM Garbage Collector et JVM Performance Indicateurs, et convient à différents scénarios. Il décrit les caractéristiques de style de l'algorithme de recyclage.
Recyclage en série unique vs recyclage parallèle multithread
La question de savoir si l'opération de recyclage elle-même est traitée par plusieurs threads. Les avantages du recyclage unique sont qu'il est simple, facile à mettre en œuvre, avec peu de fragments, et convient aux machines monocomes. Le recyclage parallèle multithread peut utiliser pleinement les ressources CPU sur les machines multi-cœurs, réduire le temps de recyclage et augmenter la productivité. L'inconvénient est qu'il est complexe et que certains fragments peuvent ne pas être recyclés.
Pause du thread d'application pendant le recyclage vs recyclage et application simultanément
Délivrer de la pause du thread d'application pendant l'opération de recyclage. Les avantages de la pause des fils d'application sont qu'ils sont simples, précis, nettoyés relativement propres et nettoyés pendant une courte période (à l'exclusion des ressources CPU). L'inconvénient est que la pause des threads d'application entraînera une prolongation du temps de réponse de l'application pendant le cycle de collecte des ordures, et les systèmes avec des performances en temps réel très élevées sont plus sensibles. Les avantages du traitement parallèle du recyclage et des threads d'application sont que le temps de réaction d'application est relativement stable, et les inconvénients sont qu'il est difficile à réaliser, une fréquence de nettoyage élevée et une éventuelle fragmentation.
Déterminez les fragments de mémoire libérés vs fusionner les fragments de mémoire libérés vs copier le vivant dans 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 partout dans le tas. S'ils ne sont pas gérés, il y aura deux problèmes. Lorsque l'attribution de la mémoire est lente en raison de la recherche de mémoire disponible, les petits fragments entraîneront des déchets de mémoire (comme les grands tableaux nécessitent de gros fragments de mémoire continue). Il existe deux façons de gérer: déplacer la mémoire vivante à une extrémité du bloc de mémoire, enregistrer la position de départ de la mémoire disponible ou simplement copier la mémoire vivante dans une nouvelle zone de mémoire, et le bloc de mémoire d'origine est complètement vide.
Métriques de performance
①. Productivité (débit)
Le ratio du temps de non-récupération au temps total dans une période plus longue (seules les longues périodes sont significatives). Mesurer l'efficacité opérationnelle du système.
②. Collection des ordures au-dessus
Le rapport du temps de récupération à un temps total sur une période plus longue. Correspondant à la productivité, la somme totalise 100%.
③. Temps de pause
Lorsque les machines virtuelles Java recycleront les ordures, certains algorithmes susciteront l'exécution de tous les threads d'application et certains systèmes peuvent être sensibles à l'intervalle de temps de pause.
④. Fréquence de collecte
Combien de temps faut-il pour récupérer?
⑤. La taille de l'utilisation de la mémoire (empreinte)
Comme la taille du tas.
⑥. En temps réel (rapidité)
Combien de temps faut-il pour qu'un objet occupe la mémoire de l'objet recyclé?
Types de collecte des ordures
Tous les types de recycler sont basés sur la technologie générationnelle. La machine virtuelle Java Hotspot comprend trois générations, la jeune génération, l'ancienne génération et la génération permanente.
Génération permanente
Stocke les classes, les méthodes et leurs informations de description. La taille initiale et la valeur maximale peuvent être spécifiées par 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, mais s'il y a trop de classes chargées et pas assez, ajustez simplement la valeur maximale.
② Génération plus âgée
Les principaux objets de stockage de la jeune génération qui survivent et mettent à niveau après plusieurs cycles de recyclage sont toujours en vie. Bien sûr, pour certaines grandes allocations de mémoire, ils peuvent également être directement alloués à la génération permanente (un exemple extrême est que la jeune génération ne peut pas sauver du tout).
Génération Young
La plupart des actions d'attribution et de recyclage de la mémoire se produisent dans les jeunes générations. 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 (survivants). Les deux zones de survie sont divisées en et à selon leurs fonctions. La plupart des objets sont alloués dans la zone d'origine, et plus d'une opération de collecte des ordures survit est placée dans le salon.
Collectionneur en série
Un seul thread effectue une opération de recyclage, suspend l'exécution de tous les threads d'application pendant la période de recyclage. Le recycleur par défaut en mode client est obligé d'être spécifié via l'option de ligne de commande -xx: + usageerialgc.
Collection Minor pour les jeunes générations
Déplacez les objets survivants dans la zone d'Eden vers la zone. Si la zone à ne pas être installée, passez directement à l'ancienne génération. Si la zone de la zone ne peut pas être installée, passez directement à l'ancienne génération. Si la zone de la zone est très ancienne, passez à l'ancienne génération. Une fois le recyclage terminé, Eden et des zones sont vides. À l'heure actuelle, les fonctions de et à sont échangées, de sont modifiées en et vers et vers et est vide avant chaque cycle de recyclage. La sélection de conception est une réplication.
②L'algorithme de recyclage pour les personnes âgées (collection complète)
Le recyclage des personnes âgées est divisé en trois étapes: marquer, balayer et fusionner. L'étape de marquage marque tous les objets survivants, le stade de compensation libère tous les objets morts, et le stade de fusion fusionne tous les objets survivants dans la partie précédente de l'ancienne génération, laissant tous les fragments libres derrière. La sélection de conception est fusionnée pour réduire la fragmentation de la mémoire.
Collecteur parallèle
Utilisez plusieurs fils pour effectuer la collection des ordures en même temps. L'environnement multi-core peut utiliser pleinement les ressources CPU, réduire le temps de recyclage, augmenter la productivité JVM et le recycleur par défaut en mode serveur. Comme le recycleur série, l'exécution de tous les threads d'application est suspendue lors du recyclage. Forcé de spécifier via l'option de ligne de commande -xx: + useParallelGC.
Collection Minor pour les jeunes générations
Plusieurs fils sont utilisés pour recycler les ordures, et l'algorithme de chaque fil est le même que celui d'un recycleur en série.
②L'algorithme de recyclage pour les personnes âgées (collection complète)
La génération plus âgée est toujours unique, la même que le recycleur en série.
Collection de compactage parallèle
Le recyclage de la jeune génération et de la génération plus âgée est traité par le multi-threading. Spécifié par l'option de commande -xx: + useParalleLoldgc, xx: parallelgcthreads = 3 peut en outre spécifier le nombre de threads participant au recyclage parallèle. Comme le recycleur série, l'exécution de tous les threads d'application est suspendue lors du recyclage. Par rapport aux recycleurs parallèles, la génération plus âgée a un temps de recyclage plus court, réduisant ainsi le temps de pause. Forcé de spécifier via xx: + useParalleLoldgc Command Line Option.
Collection Minor pour les jeunes générations
Identique au collecteur parallèle
②L'algorithme de recyclage pour les personnes âgées (collection complète)
Les personnes âgées sont divisées en trois étapes: marquer, compter et fusion. L'idée de division est utilisée ici, et l'ancienne génération est divisée en de nombreuses régions de taille fixe. Au stade de marquage, tous les objets survivants sont divisés en groupes N (le nombre de threads recyclés devrait être le même que le nombre de fils recyclés). Chaque fil est indépendamment responsable de son propre groupe, marquant l'emplacement des objets survivants et les informations sur le taux de survie de la région (région), et le marquant comme parallèle. Au stade statistique, le taux de survie de chaque région est compté. En principe, le taux de survie à l'avant est relativement élevé. De l'avant en arrière, la position de départ qui vaut la peine d'être fusionnée (les zones où la plupart des objets survivent ne valent pas la peine d'être fusionnées). L'étape statistique est en série (thread unique). Au stade de la fusion, sur la base des informations de l'étape statistique, plusieurs threads copient les objets survivants d'une région à une autre région en parallèle.
Collectionneur de mark-sweep simultanée
Également connu sous le nom de collecteur de faible latence, l'application est suspendue pour une période plus courte par divers moyens. Effectue essentiellement des opérations de recyclage simultanément avec l'application, sans fusion et copie des opérations. Spécifiée via la ligne de commande -xx: + USECOnCMarksweepgc, vous pouvez également spécifier l'utilisation du mode de recyclage incrémentiel -xx: + USECOCCARKSWEEPGC dans des systèmes monocomes ou à deux nages. Le recyclage incrémentiel fait référence à la division de l'opération de recyclage en plusieurs fragments, à l'exécution d'un fragment et à la libération de ressources CPU à l'application, puis à recycler le dernier résultat à un certain point dans le futur. Le but est également de réduire le retard.
Collection Minor pour les jeunes générations
Identique au collecteur parallèle
②L'algorithme de recyclage pour les personnes âgées (collection complète)
Il est divisé en quatre étapes: marque initiale, marque, marque, remarque et balayage simultané. Portez une attention particulière, il n'y a pas de fonctionnement de fusion, donc il y aura des fragments.
Outil d'évaluation des performances pour Java Garbage Collector
①xx: + printgcdetails et xx: + printgctimestamps
Informations sur l'heure de début, la durée, la mémoire de chaque génération, etc.
②jmap [Options] PID
JAMP 2043 Affichez les objets partagés qui ont été chargés dans le processus 2043. Généralement des fichiers DLL.
JMAP -HEAP 2043 Vérifiez 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 de la classe.
③jStat [Options] PID
JSTAT -Class 2043 Chargement de classe, déchargement, utilisation de la mémoire.
JSTAT -GC 2043 GC Exécution Statut.
post-scriptum
Java fournit des fonctions de sélection automatique et d'optimisation automatique des performances. Avant de faire un réglage des collectionneurs de déchets, énumérez d'abord les indicateurs de performance qui vous préoccupent, dites au JVM les indicateurs de performance qui vous préoccupent via la ligne de commande et réglé automatiquement par le JVM. Si vous n'êtes pas satisfait, vous pouvez spécifier le collecteur des ordures. OutOfMemory est généralement dû à une mémoire de tas insuffisante, vous pouvez donc ajuster les lignes de commande -xmx1024m et -xx: maxpermSize = 128m.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.