Programmeur uauc 2021-08-19 22:37:59 阅读数:740
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.
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 .
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.
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 .
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. .
(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 :
(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.
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 :
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. .
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.
Pendant nos séances d'entraînement pratique , Ces paramètres sont utilisés dans l'ensemble .
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.
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. .
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. .
Nous avons aussi beaucoup de noms . Résumons - le. :
Algorithmes
Sous - génération
Minor GC
Major GC
Terminologie
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
Copyright:Cet article est[Programmeur uauc]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210819223513955z.html