Avez - vous vraiment une bonne compréhension du recyclage des ordures?Je suis resté debout tard et j'a i analysé en profondeur la synchronisation principale et de secours de MySQL haute disponibilité

Programmeur uauc 2021-08-19 22:37:59 阅读数:740

avez vous vraiment une bonne
  • Eden Encore une fois GC,L'algorithme de réplication est utilisé,Oui. Eden Et from Les zones sont nettoyées ensemble.Les objets vivants sont copiés à to Zone;Et puis...,Il suffit de vider from Le quartier est parfait.

Donc dans ce processus,Il y aura toujours un Survivor La partition est vide.Eden、from、to L'échelle par défaut pour est 8:1:1,Donc ça ne fait que 10% Le gaspillage d'espace.

Cette échelle,C'est le paramètre -XX:SurvivorRatio Configuré pour(Par défaut 8).

En général,Il suffit de comprendre ce niveau OK C'est.Mais dans les interviews habituelles,Un autre point est souvent mentionné,Même si la fréquence n'est pas trop élevée,C'est ça. TLAB,Nous vous présentons aussi brièvement.

TLAB Son nom complet est Thread Local Allocation Buffer,JVM Par défaut, chaque thread a un buffer Région,Pour accélérer l'assignation des objets.C'est buffer Juste là. Eden Dans la zone.

C'est logique et Java Dans la langue ThreadLocal Similaire,Éviter les opérations dans les espaces publics,Et quelques serrures en compétition.

image

L'affectation des objets a priorité sur TLABAllez. Répartition,Mais... TLAB C'est généralement petit. , Donc quand l'objet est relativement grand, ,Il sera là. Eden Zone partagée de la zone assignée .

TLAB Est une technique d'optimisation , Des optimisations similaires sont disponibles pour l'attribution d'objets sur la pile ( Cela peut mener à l'analyse de l'évasion ,Par défaut). C'est une optimisation très détaillée , Pas trop de présentations , Mais de temps en temps, on demande .

Vieux temps

Utilisé dans les temps anciens “Marquage-Effacer”、“Marquage-Organiser”Algorithmes,Parce que le taux de survie des sujets âgés est généralement plus élevé, L'espace est grand. , Ce n'est pas une bonne copie. , Plutôt une collecte sur place .

Alors, Comment les objets sont - ils entrés dans l'âge? ? Il y a plusieurs façons .

(1)Promotion(Promotion)

Si l'objet est assez vieux ,Va passer“Promotion”Dans la génération plus âgée.

À propos des objets , C'est par son âge. (age) Pour juger . Chaque fois qu'il se produit Minor GC, L'âge des survivants augmente. 1. Jusqu'à ce qu'un certain seuil soit atteint , C'est tout. “ Vieux têtu. ” Pour passer à l'âge avancé .

Si ces objets deviennent inaccessibles , Jusqu'à ce que ça arrive. GC Quand, Pour être nettoyé .

Ce seuil ,Vous pouvez passer par les paramètres ‐XX:+MaxTenuringThreshold Configurer, La valeur maximale est 15, Parce qu'il est utilisé 4bit Stocké(Donc ces gros articles sur le Web qui vont ajuster cette valeur, Il n'y a aucune raison. ).

(2) Répartition des garanties

Regardez l'image de la jeune génération. , Objets vivants à chaque fois , Dans l'une des zones survivantes. , L'échelle par défaut pour cette zone est 10%.Mais nous ne pouvons pas garantir que chaque objet vivant est inférieur à 10%,Quand Survivor Pas assez d'espace , Dépend d'une autre mémoire ( C'est vieux. ) Garantie de distribution .À ce moment - là., Les objets sont également distribués directement aux générations plus âgées .

(3) Les grands objets sont distribués directement aux personnes âgées

Les objets de plus d'une certaine taille seront attribués directement à la génération plus âgée. Cette valeur passe par le paramètre ?
-XX:PretenureSizeThreshold Configuré pour.Par défaut 0, Ça veut dire tous les préférés. Eden Répartition des districts .

(4) Détermination de l'âge des objets dynamiques

Certains algorithmes de collecte des ordures , Pas besoin. age Doit atteindre 15 Jusqu'à l'âge avancé. , Il utilise des méthodes de calcul dynamiques .Par exemple,,Si la somme de la taille de l'objet du même âge dans la zone de survie, Plus de la moitié de la zone de survie ,Supérieur ou égal à age L'objet de .

Ces décisions dynamiques ne sont généralement pas soumises à un contrôle externe. , On sait que c'est bon. .La logique d'attribution d'un objet peut être vue à travers le diagramme ci - dessous.

image

Marquage des cartes (card marking)

Vous pouvez voir, La relation de référence de l'objet est un grand maillage . Certains objets peuvent être Eden Zone, Peut - être dans la vieillesse. ,Comment cette référence intergénérationnelle est - elle traitée??Parce que Minor GC C'est arrivé seul. , Si un objet d'une époque plus ancienne l'a référencé ,Comment assurer la survie des jeunes générations?

Oui. 、 Non. , Nous utilisons habituellement Bitmap(Bitmap) Et les filtres Bloom pour accélérer la recherche .Si vous ne connaissez pas ce concept, vous aurez besoin d'un supplément après les cours.

JVM De la même façon. .En fait..., L'âge est divisé en beaucoup de pages de cartes (card page)De( La quantité générale est 2 Sous - puissance de ).

Tableau des cartes(Card Table) Est une collection utilisée pour marquer l'état de la page de carte , Une page de carte par élément de tableau de carte .

Si les jeunes générations ont des objets assignés , Et il y avait des objets dans les temps anciens qui pointent vers ce nouvel objet. , Donc la page de carte de la mémoire correspondant à cet objet ancien, Sera identifié comme dirty,Les tables de cartes n'ont besoin que d'un très petit espace de stockage pour conserver ces états.

Lors de la collecte des ordures, Lisez d'abord cette carte. , Faire un jugement rapide .

HotSpot Collecteur d'ordures

Voici une introduction HotSpot Plusieurs collecteurs d'ordures , Chaque type de récupérateur a ses propres caractéristiques . Nous avons GC Lors de l'optimisation ,Assurez - vous de savoir quel type de collecteur d'ordures est utilisé maintenant.

Avant ça,Nous avons rassemblé les déchets de génération en génération ci - dessus dans une grande image, Lors de l'introduction des collecteurs suivants , Vous pouvez les localiser. .

image

Jeune génération de collecteurs d'ordures

(1)Serial Collecteur d'ordures

Traitement GC Il n'y a qu'un seul fil ,Et mettre en pause tous les Threads utilisateurs pendant la collecte des ordures.

C'est le collecteur d'ordures le plus simple. , Mais ne croyez pas que ça n'a pas marché. . Parce que c'est simple. , Donc efficace , Il est généralement utilisé dans les applications client .Parce que l'application client ne crée pas beaucoup d'objets fréquemment, L'utilisateur ne sentira pas non plus de blocage évident .Au contraire., Il utilise moins de ressources , Et plus léger .

(2)ParNew Collecteur d'ordures

ParNew - Oui. Serial Version multithreadée de . Par plusieurs GC Thread nettoie les ordures en parallèle . Le processus de nettoyage doit encore arrêter le thread utilisateur .

ParNew Poursuite“ Temps de pause faible ”,Avec Serial La seule différence est l'utilisation de multithreads pour la collecte des ordures,- Oui. CPU Rapport de performance dans l'environnement Serial Il y aura une certaine amélioration ; Mais le changement de fil nécessite des frais généraux supplémentaires , Donc, dans un seul CPU Moins performant dans l'environnement Serial.

(3)Parallel Scavenge Collecteur d'ordures

Une autre version multithreadée du collecteur d'ordures .Elle est liée à ParNew La principale différence entre :

  • Parallel Scavenge:Poursuite CPU Débit, Capacité d'accomplir les tâches spécifiées en peu de temps , Convient à l'informatique de fond sans interaction . Faible interaction calcul fort .
  • ParNew: Poursuivre la réduction des temps d'arrêt des utilisateurs , Convient aux applications interactives . Forte interaction faible calcul .

Vieux collecteur d'ordures

(1)Serial Old Collecteur d'ordures

Avec les jeunes générations Serial Collecteur d'ordures correspondant , Sont des versions monothreadées , Convient également aux clients .

Jeune génération Serial, Utilisation d'algorithmes de réplication .

Vieux. Old Serial,Utilisation de marqueurs-Algorithme de tri.

(2)Parallel Old

Parallel Old Le collecteur est Parallel Scavenge Une version plus ancienne de ,Poursuite CPU Débit.

(3)CMS Collecteur d'ordures

CMS(Concurrent Mark Sweep) Le collecteur est utilisé pour obtenir le plus court GC Collecteur avec temps de pause comme cible , Il permet aux Threads utilisateurs et GC Les Threads peuvent être exécutés simultanément ,Par conséquent, l'utilisateur ne sentira pas non plus le blocage évident pendant la collecte des ordures. Nous le détaillerons plus tard dans la classe. .

A long terme,CMS Collecteur d'ordures, Est d'être G1 Attendez que le collecteur d'ordures soit remplacé. .In Java8 Après, L'utiliser lancera un avertissement .

Java HotSpot 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.

Paramètres de configuration

En plus des collecteurs d'ordures ci - dessus , Nous avons G1、ZGC Un collecteur d'ordures plus avancé ,Ils ont tous des paramètres de configuration spécifiques pour les rendre efficaces.

Adoption -XX:+PrintCommandLineFlags Paramètres, Peut voir le courant Java Version du collecteur d'ordures par défaut . Vous pouvez regarder dans mon système Java13 Le collecteur par défaut est G1.

java -XX:+PrintCommandLineFlags -version

-XX:G1ConcRefinementThreads=4 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC

java version “13.0.1” 2019-10-15

Java SE Runtime Environment (build 13.0.1+9)

Java HotSpot 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

Voici quelques paramètres de configuration :

  • -XX:+UseSerialGC Collecteur série pour les jeunes et les personnes âgées
  • -XX:+UseParNewGC Utilisation par les jeunes générations ParNew, Utilisé dans les temps anciens Serial Old
  • -XX:+UseParallelGC Utilisation par les jeunes générations ParallerGC, Utilisé dans les temps anciens Serial Old
  • -XX:+UseParallelOldGC Des collecteurs parallèles sont utilisés à la fois pour les générations nouvelles et âgées
  • -XX:+UseConcMarkSweepGC, Indique l'utilisation par les jeunes générations ParNew, L'usage du vieux temps CMS
  • -XX:+UseG1GC Utiliser G1Collecteur d'ordures
  • -XX:+UseZGC Utiliser ZGC Collecteur d'ordures

Pour vous donner une meilleure impression ,Voir l'image ci - dessous. Leur relation est compliquée. .Attention particulière -XX:+UseParNewGC Ce paramètre,C'est déjà Java9 Il a été abandonné. . Beaucoup de programmes (Par exemple, ES) Cette erreur sera signalée , Ne soyez pas surpris. .

image

Il y a tant de collecteurs d'ordures et de paramètres , Qu'est - ce qu'on va utiliser? ? Où optimiser ?

Pour l'instant,Bien que Java Version plus élevée de , Mais le plus utilisé Java8.De Java8 Mise à jour vers une version ultérieure Java Système, Il y a un coût. ,Alors... CMS Le collecteur d'ordures durera encore un certain temps. .

Collecteur d'ordures le plus utilisé en ligne ,Il y a juste CMS Et G1,Et Java8 Par défaut Parallel Scavenge.

  • CMS Paramètres de configuration pour :-XX:+UseConcMarkSweepGC.
  • Java8 Paramètres par défaut pour :-XX:+UseParallelGC.
  • Java13 Paramètres par défaut pour :-XX:+UseG1GC.

Pendant nos séances d'entraînement pratique , Ces paramètres sont utilisés dans l'ensemble .

STW

Avez - vous déjà pensé , Si les déchets sont recyclés ( Qu'il s'agisse d'étiquettes ou de copies de collation ), Et s'il y a un nouvel objet? ?

Pour s'assurer que les procédures ne sont pas confuses ,La meilleure façon est de mettre en pause tous les Threads de l'utilisateur. C'est à ce moment - là. , Tu ne peux pas. new Objet,Je ne peux qu'attendre..Se manifeste dans JVM En haut, c'est un court carton. , Je ne peux rien faire. . Ce mal de tête , Ça s'appelle Stop the world.Abréviations STW.

Phase de marquage, La plupart le font. STW De. Si vous ne mettez pas en pause le processus utilisateur , Lors du marquage des objets ,Il est possible que d'autres Threads utilisateurs produisent de nouveaux objets et références, Créer la confusion .

Collecteur d'ordures actuel , Pour minimiser ce processus. . Mais même les plus avancés ZGC, Il y aura un court moment. STW Processus. Tout ce que nous avons à faire, c'est d'utiliser l'infrastructure existante ,Réduire au minimum GC Pause.

Tu as peut - être raison. STW Il n'y a pas de concept d'impact , Je vais vous donner un exemple. .

Le trafic de pointe pour un service hautement simultané est 10 10 000 fois/Secondes, Derrière. 10 Machine d'équilibrage de charge , Donc chaque machine a besoin en moyenne 1w/s. Si une machine se produit pendant ce temps, STW, Ça a duré. 1 Secondes, Alors, c'était nécessaire. 10ms On peut y retourner. 1 10 000 demandes, Doit attendre au moins 1 Secondes.

image

Performance auprès des utilisateurs , C'est le système. . Si notre GC Très souvent. , Ce genre de carton est particulièrement évident. , Impact grave sur l'expérience utilisateur .

Bien que Java Nous offre un excellent mécanisme de gestion automatique de la mémoire, Mais pas d'abus. , Parce qu'il y a STW Dur. .

Résumé

Il y a beaucoup de contenu dans cet article .En raison de l'espace limité, Nous n'avons présenté que les points les plus importants , Si vous creusez profondément , On ne peut pas finir un livre. .

En fin de compte,Les collecteurs d'ordures de toutes les couleurs sont conçus pour résoudre les maux de tête STW Questions,Jean GC Moins de temps , Moins de pause , Plus de débit .

Recycleur actuel , Basé sur l'hypothèse de la génération faible , Principalement le concept de recyclage par génération . Pour les jeunes et les personnes âgées , Il existe différents algorithmes de collecte des ordures , Certains peuvent être combinés .

Nous avons particulièrement parlé du recyclage des déchets pour les jeunes générations. .

  • La jeune génération est GC Zones gravement touchées , La plupart des objets ne sont pas vieux. ;
  • Les entretiens sont fréquents. , Ce sont des principes très simples. ;
  • Pour nous G1 Et ZGC Jeter les bases de l'introduction .

Nous avons aussi beaucoup de noms . Résumons - le. :

Algorithmes

  • Mark
  • Sweep
  • Copy
  • Compact

Sous - génération

  • Young generation
  • Survivor
  • Eden
  • Old generation | Tenured Generation
  • GC

Minor GC

Major GC

Terminologie

  • weak generational hypothesis
  • Répartition des garanties
  • Promotion
  • Marquage des cartes
  • STW

Résumé Final

Algorithme terminé,Les octets d'entrevue n'ont plus peur,J'ai besoin de partager ça dans l'articleArbre binaire、Liste des liens、String、Pile et file d'attente, etc. points de connaissance à haute fréquence et analyse des entrevues,EtAlgorithme de brossageLeetCodeLes gars de la version chinoise peuvent faire des compliments après Disponible gratuitement en cliquant ici!

Partagez une dernière copieLe grand sac cadeau de l'architecture de déchirure à la main ultime(Notes d'étude):Distribué+Microservices+Cadre Open Source+Optimisation des performances

image

Copyright:Cet article est[Programmeur uauc]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210819223513955z.html