2010-10-08 6 views
0

Existe-t-il des astuces, astuces et techniques pour empêcher ou minimiser les ralentissements ou le gel temporaire d'une application à cause du .NET GC?Comment prévenir ou minimiser les effets négatifs de .NET GC dans une application en temps réel?

Peut-être que quelque chose le long des lignes de:

  1. Essayez d'utiliser struct si vous le pouvez, à moins que les données est trop grande ou sera surtout utilisé dans d'autres classes, etc.
+0

Vous rencontrez des problèmes spécifiques? Est-ce que votre application est une application en temps réel ou quelque chose? – JMarsch

+3

Si vous avez besoin d'une application "en temps réel", vous aurez probablement besoin d'utiliser un O/S en temps réel. Je ne connais pas de support .Net (soyez curieux de voir s'il y en a). –

+0

@JMarsch, oui mon application est en temps réel, mais n'a pas encore rencontré de problèmes. C'est juste que l'application doit faire les choses sans "beaucoup" d'interruption. Fondamentalement dire si l'application rend la scène 3D dans un fil différent tandis que l'utilisateur fait quelque chose d'autre dans l'application, le GC ne devrait pas geler l'application en raison de l'instanciation intensive du moteur de rendu, etc –

Répondre

5

La description de votre application ne correspond pas à la signification habituelle de "temps réel". Realtime est couramment utilisé pour les logiciels qui ont une latence maximale en millisecondes ou moins.

Vous avez une exigence de réactivité vis-à-vis de l'utilisateur, ce qui signifie que vous pourriez probablement tolérer un retard accidentel de 500 ms ou plus. 100 ms ne seront pas remarqués.

Heureusement pour vous, le CPG ne causera pas de délais aussi longs. Et si c'était le cas, vous pourriez utiliser la version Serveur (arrière-plan) du GC, mais je connais peu les détails. Mais si votre "expérience utilisateur" souffre, ce ne sera probablement pas le CPG.

+0

convenu simplement mettre le rendu à une haute priorité. – kenny

+0

Merci Henk. Je pensais que GC gèlerait mon application pour un temps notable. Je n'ai jamais vu cela, mais je n'ai pas écrit dire une application 3D complète qui effectue des calculs intensifs lourds avec éventuellement des millions de données intermédiaires/déchets dans un délai relativement court. Le déplacement, le nettoyage et la compacité des données GC dans l'espace mémoire de l'application ne verrouilleraient-ils pas l'application dans son ensemble? Je pensais que ce serait nécessaire parce que la mémoire ne peut pas être modifiée quand le GC fait ses choses. –

3

à mon humble avis, Si la performance de votre application est sensiblement affectée par le GC, quelque chose ne va pas. Le GC est conçu pour fonctionner sans intervention et sans affecter de manière significative votre application. En d'autres termes, vous ne devriez pas avoir à coder avec les détails du GC en tête. Je voudrais examiner la structure de votre application et voir où sont les goulots d'étranglement, peut-être en utilisant un profileur. Il y a peut-être des endroits où vous pourriez réduire le nombre d'objets créés et détruits.

Si des parties de votre application doivent vraiment être en temps réel, elles devraient peut-être être écrites dans une autre langue conçue pour ce genre de choses.

2

Une autre astuce consiste à utiliser GC.RegisterForFullNotifications sur back-end. Supposons que vous ayez un serveur d'équilibrage de charge et une application N, par exemple. les serveurs. Lorsque l'équilibreur de charge reçoit des informations sur un GC complet sur l'un des serveurs, il transfère les requêtes vers d'autres serveurs pendant un certain temps. Le GC n'est donc pas affecté par le GC (particulièrement utile pour les boîtes x64 où plus de 4GB peuvent être adressés).

Mise à jour

Non, malheureusement je n'ai pas un code, mais il est un exemple très simple à MSDN.com avec des méthodes factices comme RedirectRequests et AcceptRequests qui se trouve ici: Garbage Collection Notifications

+0

+1 - comment informez-vous l'équilibreur de charge, avez-vous du code que vous pouvez partager? – kenny