Les meilleures pratiques pour optimiser la mémoire en C#
Quelles sont les meilleures pratiques pour optimiser la mémoire en C#.
Je suis en utilisant la technique suivante pour optimiser ma mémoire.
- Disposer d'un objet après l'utilisation ou à la rendre nulle.
- Utiliser try/finally ou à l'aide de bloc.
- Utilisation GC.Collect() si nécessaire.
- Supprimer inutilement l'initialisation de l'objet.
- Gérer le cache d'Image.
- Mange des données BLOB, Mémoire de flux de flux de fichiers et
Même si il y a des fuites de mémoire.
Mon application utilise choses suivantes:
- De traitement de fichiers de configuration,
- À l'aide d'autres fichiers XML.
- À l'aide de fonctions d'image zoom avant, zoom arrière, affichage de différents types d'images, changer la couleur d'images, l'enregistrement des données en xml.
- L'enregistrement de données dans SQL server.
- Je n'ai aucune idée de quoi vous parlez.
- Pourquoi pensez-vous que vous avez à faire tout cela, autre que le
using
des blocs? C# n'a pas l'habitude de souffrir de fuites de mémoire. - Il y a très peu de cas, où vous devez manuellement appel
GC.Collect
. - Il n'y a pas qu'une seule façon, pour "optimiser" la mémoire, je pense que vous devez décrire votre problème, de sorte qu'il peut être diagnostiqué en premier. Qu'entendez-vous par "Même si il y a des fuites de mémoire"? Si vous n'avez pas un problème (encore), alors vous devez attendre avec "l'optimisation" jusqu'à ce que vous avez un problème concret. En attendant, il suffit de suivre les meilleures pratiques telles que l'utilisation d'Éliminer correctement.
- Je ne suis pas en mesure de suivre que de où la mémoire est une fuite.
- Si les données sont utilisées, comme le niveau de la classe, alors comment puis-je utiliser l'aide du bloc pour que.
- Si jetables de données est utilisé dans un domaine de votre classe, alors que la classe doit également être IDisposable, et celui qui l'utilise doit utiliser
using()
. Pour détecter les fuites de mémoire utiliser un profiler comme CLRProfiler ou les FOURMIS Profiler.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser Redgate FOURMIS Memory profiler (non-libre).
Ou CLR profiler (gratuit): https://msdn.microsoft.com/library/ms979205
GC.Collect()
n'est pas recommandée, même si elle est nécessaire dans certains cas. Veuillez consulter ci-dessous le code:Dans l'exemple ci-dessus j'ai utilisé
GC.Collect()
parce que Si je n'utilise pasGC.Collect()
puis il prend de la mémoire autour de 1500mb. Mais après l'utilisation deGC.Collect()
s'est jamais plus que 75 moc'est à dire l'utilisation de la Mémoire est a diminué de 20 fois.
Mais si
GC.Collect()
est utilisé de façon excessive et il n'y a pas beaucoup d'objets inutilisés couché dans la mémoire, puisGC.Collect()
va ralentir votre performance et c'est beaucoup de temps.Vous pouvez également utiliser
Dispose()
si elle met en œuvreIDisposable
.Si vous travaillez avec
MemoryStream
ou tout autre type de contenu, vous devez utiliser l'using
blocs.Parfois vous devez également vide d'un objet en le rendant
null
.Comme nous le savons données si nous traitons les données XML, puis il prend très lourd de mémoire, donc nous avons besoin de libérer la mémoire après utilisation mais XML classe n'implémente pas l'interface Idisposable de sorte que vous avez à faire, nulle (par exemple,
xmldocument=null;
)Vous devez également garder à l'esprit à propos de inutile l'initialisation de l'objet.
par exemple, au Lieu de:
Utilisation:
Essayez d'utiliser la méthode de niveau variable au lieu de le niveau de la classe si elle est utilisée dans une seule méthode.
Assurez-vous que vous êtes à la compensation des objets de collection.
Surveiller l'utilisation de la mémoire par une tierce partie de l'outil qui est utilisé dans votre application. Parfois, des outils de tiers prend très élevée de la mémoire.
Utilisation
static
seulement si, il est incontournable.Utilisation
StringBuilder
au lieu deString
. Parce que si la chaîne est concaténé puis une nouvelle mémoire est allouée de sorte que les vieux de la mémoire de données n'est pas utilisé, mais il est conservé dans la mémoire RAM.Si tout objet de grande taille est en cours de traitement dans une arborescence de classes de veiller sur elle.
Si un document XML est traité et il a été conservé en mémoire pour une utilisation ultérieure et qui sera à l'utilisation après tout événement, puis relâchez que la mémoire et charger le fichier XML où l'événement est déclenché.
Éviter le clonage.
Si Vous travaillez avec la manipulation de chaînes, vous pouvez vérifier les données de boucle infinie. Parfois spécial des caractères Unicode comme des points de suspension(...) peut créer problème et les causes de boucle infinie.
Vous pouvez également utiliser dotTrace un profileur de mémoire par Jetbrain.
Vous pouvez aussi regarder journal des événements pour toute exception qui est à l'origine du problème.
Si tout objet bitmap est en cours de création et de certains de traitement de l'image est effectué puis un coup d'oeil sur les Ressources non managées. Un objet bitmap prendre une énorme mémoire pour les ressources non managées et qui pourrait ne pas être publié.
Comme vous l'avez mentionné que vous êtes également à l'aide de SQL server, puis aussi surveiller SQL serveur, des procédures et des fonctions et leur appel stratégies.
Dans SQL Server si vous enregistrez toutes les données comme type de données image et si elle est supérieure à 1 mo alors s'il vous plaît utiliser varbinary(MAX) avec filestream bien, mais il fonctionne avec SQL server 2008 ou supérieur versions de SQL server.
Beaucoup de ces n'avez pas vraiment d'optimiser la mémoire...
Dispose()
un objet s'il estIDisposable
. Cela POURRAIT vous sauver des problèmes de mémoire, mais pas nécessairement. (Aussi, l'utilisationUsing
si possible)try/finally
- Ce qui est similaire àUsing
pour les objets qui ne sont pasIDisposable
(je les trouve être salissant, donc je préfère cette solution).GC.Collect()
. Normalement, leGC
feront un meilleur travail sur le fait de savoir quand pour recueillir quelque chose que vous.FileStream
ouvert, alors que le besoin d'avoir saDispose()
méthode appelée. Si vous faites une classe, qui a des membres qui mettent en œuvre desIDisposable
, alors vous devriez faire de votre classe en œuvreIDisposable
.les meilleures pratiques pour optimiser la mémoire en C#,
private
IDisposable
interfaces sur vos objets personnalisés et de libérer toutes les ressources(le cas échéant), un registre de tous les événements, etcdispose
lorsqu'un objet n'est plus nécessaire pour vos objets personnalisésstatic
variables d'instances ou, si nécessaire, puis trop réfléchir à deux fois si ces objets sont nécessaires dans l'ensemble de la durée de vie du programmeGC.Collect()
manuellement,(c'est une mauvaise pratique)..or make it null
n'a pas le même effet queDispose()
!Être prudent. Vous devez disposer de votre objet. Mis à
null
n'est pas nécessaireEt mis à
null
n'est pas immédiat gratuit à toutes les ressources.Normalement, ce n'est pas nécessaire, parce que le GC a son propre cycle de vie quand à collecter. Depuis .NET 4.5, vous pouvez compacter la liturgie des heures, si vous pensez qu'il y a une fragmentation: