-GC2 haute performance

Avec des questions à penser! Bonjour à tous

La dernière fois que nous avons parlé de quelques-unes des bases de la GC, grâce à grand frère m'a montré un commentaire.

Les paramètres de configuration

  Méthode sur la configuration du garbage collector est pas beaucoup, il est recommandé de ne pas se déplacer librement, la configuration et le réglage du collecteur d'ordures, dans une large mesure par la configuration matérielle, le comportement, les ressources disponibles et les décisions du programme. Une poignée de plusieurs paramètres est également utilisé pour contrôler le comportement d'un très haut niveau, en fonction du type de programme,

Mode Workstation ou en mode serveur?

  mode station de collecte des ordures par défaut utilisé. mode station de travail, tout le long de GC pour déclencher la priorité de fil de collecte des ordures (priorité praɪɔːrəti) sont les mêmes. Pour un seul processeur informatique, un modèle de poste de travail est la seule option, d'autres paramètres configure ne sont pas valides

  En mode serveur, GC va créer son propre thread dédié pour chaque processeur logique ou noyau de processeur. Il restera en attente avant que les fils de la plus haute priorité, mais la nécessité de la collecte des ordures. Après la fin de la collecte des ordures, comme ces fils en hibernation à nouveau.

  En outre, CLR créer leur propre mémoire de tas de ventre pour chaque processeur, chaque processeur contient un petit tas objets pile et une LOH. Du point de vue de l'application, il n'y a qu'un seul segment de mémoire logique. Votre code n'est pas clair quel objet appartient à une référence d'objet de tas serait un croisement entre tout le tas.

  Plusieurs tas de mémoire apportera un avantages par écrit.

  1: la collecte des déchets peut être réalisée en parallèle, chaque fil est responsable de recyclage d'une mémoire de tas de collecte de déchets, ce qui permet le taux de collecte des ordures de manière significative le mode de station de travail Kuaiyu

  2: Dans certains cas, la vitesse d'allocation de mémoire sera plus rapide, en particulier pour LOH, car il sera attribué simultanément dans toutes les parties du tas.

la pose du béton

  

<gcServer enabled = " true " >

Dans le nœud d'exécution.

Après tout à la fin avec ce qui est bon? Si l'application est conçue pour faire fonctionner sur un hôte multiprocesseur vous êtes prêt, puis sélectionnez le mode serveur. Ainsi, dans la plupart des cas, peut rendre la collecte des ordures prend du temps à un minimum.

Si vous devez effectuer plusieurs actions géré un mode serveur hôte, de la collecte des ordures crée plusieurs filets de priorité. Si plusieurs applications sont mis en place afin que le programmateur de fil aura une incidence négative sur l'autre, si vous êtes sûr que vous voulez plusieurs applications utilisant le même mode serveur hôte collecte des ordures, ainsi qu'une pratique, il est de rendre l'existence d'une relation de concurrence les applications sont concentrées dans quelques cours d'exécution du processeur désigné, de sorte que CLR va créer son propre segment de mémoire pour ces processeurs.

Contexte collecte des ordures

Tout d'abord BackgroundGC affectent seulement le comportement de la mémoire de tas de collecte des ordures 2e génération, génération 0 et génération 1 collecte des ordures collecte des ordures utiliseront toujours la réception, qui est un fil bloque toutes les applications. la collecte des ordures de fond se fait par une deuxième génération dédié de fils de collecte des ordures,

Si elle ferme, mais non recommandé

<gcConcurrent activé = " false " />

 

Mode faible latence

Si assurer une haute performance sur une période de temps, vous ne pouvez pas effectuer avis GC génération 2 importante les frais généraux collecte des ordures. S'il vous plaît GCSettings.LatencyModel selon d'autres paramètres pour affecter l'une des valeurs de propriété suivantes.

  Lowlatency --- mode est disponible uniquement avec la station de travail GC, interdisant la collecte des déchets de deuxième génération.

  SustainedLowLatency-- appliquer GC poste de travail et le modèle de serveur, la deuxième génération est complètement interdit la collecte des ordures, mais permet la collecte des ordures de fond de deuxième génération, vous devez activer la collecte des ordures de fond.

Parce que ne sera pas défragmenté, de sorte que ces deux paramètres vont augmenter de manière significative la taille du tas managé, si votre processus nécessite beaucoup de mémoire, vous devez éviter d'utiliser ce mode de retard. Immédiatement avant d'entrer dans le mode à faible latence, il est préférable d'appliquer une collection complète des déchets, qui peut être complété en appelant GC.Collect, après avoir quitté le mode à faible latence contemporaine, immédiatement faire une collection complète des ordures,

Lorsque les conditions suivantes sont réunies pour ouvrir le mode à faible latence

  • Toute la durée de la collecte des ordures est trop long, le fonctionnement normal du programme est absolument inacceptable
  • empreinte mémoire de l'application est beaucoup plus faible que le nombre de mémoire disponible.
  • Que ce soit fermé en mode faible latence, redémarrez le programme, ou lors d'une collecte des ordures complète est effectuée manuellement, l'application peut rester un état viable.

Comment réduire la quantité de mémoire allouée

  Pour réduire la quantité de mémoire allouée, un examen critique n'a pas d'objection.

  • Vraiment vous avez besoin de cet objet?
  • Y at-il des membres de l'objet peut être abandonné
  • Tableau peut réduire le nombre?
  • Les types primitifs (primitifs) se réduire ou ne pas le volume (tel que Int64 remplacé Int32)?
  • Sont des objets rarement utilisés, ce qui rend la mission que lorsque cela est nécessaire?
  • Classe de priorité peut se transformer en un « structurel » (struct)? Ce sera stocké sur la pile, ou pour devenir membre d'autres objets
  • Allouer beaucoup de mémoire, si seulement une petite partie?
  • Que ce soit pour obtenir les données d'une autre façon?

La règle primaire

  En fait, nous savons déjà, pour le collecteur d'ordures, il y a une haute performance de base des règles de codage. En fait, le garbage collector est évidemment conçu selon cette règle.

0 objets seulement la collecte des déchets de segment de mémoire

  En bref, la durée de vie de l'objet le plus court possible, de sorte que le garbage collector ne pas avoir à les toucher, ou ne peut pas éphémère, mettre à jour le plus rapidement possible de laisser la génération objet 2 tas et toujours rester là où il ne sera jamais récupéré. Cela signifie que devrait toujours être stockés survie à long terme d'une référence d'objet en tas, généralement, il aussi signifie que les objets doivent être réutilisables mis en commun (pooling), en particulier Loh tous les objets.

Raccourcir la durée de vie de l'objet

  • Plus l'objet portée , plus aucune chance d'être promu à la prochaine génération lors decollecte des ordures.
  • En général, l'objet ne doit pas être à allouer de la mémoire avant de l' utiliser . À moins que vous créer un objet trop frais généraux. Nécessité de créer à l' avance qu'ils ne seront pas une incidence sur la mise en œuvre d'autres opérations,
  • De plus dans l'utilisation des objets, assurez -vous que l'objet est hors de portée le plus tôt possible . Pour les variables locales, il peut être après la dernière actualité, même avant que la méthode peut être terminée.
  • Si votre code pour effectuer plusieurs opérations sur un objet, essayez de raccourcir l'intervalle de la première et la dernière utilisation , de sorte que l'objet peut être récupéré GC le plus tôt possible,
  • Si un objet est une référence à un des membres de longue survivants de l'objet, parfois vous avez besoin de mettre ce fait référence à un ensemble d'affichage nul , cela peut augmenter légèrement la complexité du code un peu, parce que vous avez besoin de plus que prêt à vérifier la valeur null,

La réduction de la profondeur de l'arborescence d'objets

  Comme nous le savons tous, GC fera référence à l'objet le long du parcours, le GC en mode serveur, il y aura plusieurs threads déplacés simultanément une fois, vous voulez certainement profiter de cette concurrence, autant que possible, mais s'il y a un fil dans une très longue la chaîne d'objets imbriqués, l'ensemble du processus de collecte des ordures doivent attendre la fin du fil après l'achèvement de l'ensemble des travaux.

Décrémenter la référence entre les objets

Si l'objet référencé beaucoup d'autres objets, le collecteur de déchets lors de la traversée, il faudra plus de temps. Si la collecte des ordures références temporaires de longue date, signifie souvent de grande taille, il y a une référence à la relation entre l'objet complexe, l'objet est difficile de déterminer si toutes les relations référence, il y a un risque qu'il est difficile de prédire ce que la durée de vie des objets, ce qui réduit la référence d'objet complexité, non seulement bénéfique pour améliorer la qualité du code, mais permet également le débogage de code et la correction des problèmes de performance plus facile, doivent également faire attention aux objets entre les différentes générations de références de tas de mémoire peut conduire à un fonctionnement inefficace du collecteur des ordures, en particulier nouvel objet est référencé à partir de l'ancien objet, tel que la deuxième génération de l'objet mémoire du segment de mémoire contient une référence à un objet de génération 0, de sorte que chaque génération 0 collecte des ordures, il y a toujours une partie de la deuxième génération de segment de mémoire les objets doivent être parcourus. Afin de confirmer si elles détiennent encore la génération tas 0 objet.

 

Je suppose que tu aimes

Origine www.cnblogs.com/ccaa/p/12571485.html
conseillé
Classement