Une fuite de mémoire est une situation qui se produit lorsqu’un programme ou une application utilise la mémoire principale du système sur une longue période. Lorsque le programme ne libère pas la mémoire qu'il occupe pendant l'exécution, même après avoir terminé son processus d'exécution, cet espace mémoire alloué dégrade les performances du système et peut le rendre insensible. Dans cette rubrique, nous allons en apprendre davantage sur les fuites de mémoire C#.
Il est de la responsabilité d'un ramasse-miettes de libérer la mémoire allouée inutilisée, mais nous rencontrons toujours le problème de fuite de mémoire car nous référençons parfois l'objet inutilisé à partir d'une variable qui ne sort jamais de portée tout au long de la vie de l'application.
Syntaxe
Il existe de nombreuses façons d’éviter les fuites de mémoire en C# ; nous pouvons éviter les fuites de mémoire lorsque nous travaillons avec des ressources non gérées à l'aide de l'instruction « using », qui appelle en interne la méthode Dispose(). La syntaxe de l'instruction « using » est la suivante :
using(var objectName = new AnyDisposableType) { //user code }
Dans les instructions ci-dessus, « var » est le mot-clé utilisé pour stocker tout type de données, et le compilateur peut déterminer ce type de données au moment de la compilation. « objectName » est n’importe quel nom défini par l’utilisateur pour l’objet. 'new' est le mot-clé utilisé pour initialiser l'objet et 'AnyDisposableType' peut être n'importe quelle classe comme StreamReader, BinaryReader, SqlConnection, etc. dont l'objet peut être supprimé à l'aide de l'instruction 'using'.
Pour les applications .NET, nous disposons d'un garbage collector pour éliminer la mémoire inutilisée, mais nous rencontrons quand même le problème des fuites de mémoire. Cela ne signifie pas que le garbage collector ne fonctionne pas correctement, mais cela se produit en raison d'une certaine ignorance de la part du programmeur.
Supposons que nous ignorions les fuites de mémoire dans notre application pendant une très longue période. Dans ce cas, nous augmentons la consommation de mémoire de notre application, ce qui dégrade les performances de notre application et peut la détruire progressivement, donnant l'exception OutOfMemoryException.
Il existe deux causes principales de fuite de mémoire en C# :
Certaines raisons provoquant une fuite de mémoire en C# sont les suivantes :
Différents exemples sont mentionnés ci-dessous :
Cet exemple montre un thread attendant de se terminer et peut donc devenir une cause de fuite de mémoire.
Code :
using System; using System.Threading; namespace ConsoleApp4 { public class Program { public static void Main() { while (true) { Console.WriteLine("Press enter key to start new thread"); Console.ReadLine(); Thread thread = new Thread(new ThreadStart(StartThread)); thread.Start(); } } public static void StartThread() { Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " started"); //Wait until current thread terminates Thread.CurrentThread.Join(); } } }
Sortie :
Chaque fois que nous appuyons sur « Entrée » dans le programme ci-dessus, son utilisation de la mémoire augmente.
Exemple montrant l'utilisation de ressources non gérées à l'aide de l'instruction « using » pour éviter une fuite de mémoire.
Code :
using System; using System.IO; namespace ConsoleApp4 { public class Program { public static void Main() { string filePath = @"E:\Content\memoryLeak.txt"; string content = string.Empty; try { //writing file using StreamWriter //making use of 'using' statement to dispose object after using it using (StreamWriter writer = new StreamWriter(filePath)) { writer.WriteLine("Learning C# programming"); } //reading file using StreamReader using (StreamReader streamReader = new StreamReader(filePath)) { content = streamReader.ReadToEnd(); } } catch (Exception exception) { Console.WriteLine(exception.Message); Console.ReadLine(); } Console.WriteLine(content); Console.ReadLine(); } } }
Sortie :
Quelques points à garder à l'esprit pour éviter l'exception OutOfMemoryException due à une fuite de mémoire en C# :
Lorsqu'une application ne libère pas la mémoire qu'elle a utilisée lors de son exécution, cette mémoire sera bloquée et ne pourra être utilisée par aucun autre processus, entraînant une fuite de mémoire. Le garbage collector peut automatiquement supprimer les objets gérés mais ne peut pas supprimer les objets ou les ressources non gérés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!