Maison  >  Article  >  développement back-end  >  C# OutOfMemoryException

C# OutOfMemoryException

王林
王林original
2024-09-03 15:21:13749parcourir

OutOfMemoryException en C# est une exception levée par le moteur d'exécution du framework .NET lorsque le programme ne dispose pas de suffisamment de mémoire pour continuer son exécution. Comme son nom l'indique, cette exception se produira dans notre programme lorsque le CLR, c'est-à-dire le Common Language Runtime, ne sera pas en mesure d'allouer suffisamment de mémoire qui sera nécessaire pour effectuer certaines opérations de notre programme.

Cette exception ne signifie pas toujours que nous n'avons pas suffisamment d'espace disponible en mémoire mais parfois cela signifie que nous n'avons pas suffisamment de mémoire contiguë requise par notre programme pour l'allocation.

Syntaxe

La syntaxe pour intercepter une OutOfMemoryException en C# est la suivante :

try
{
//user code which can throw OutOfMemoryException
}
catch(OutOfMemoryException <em>exception</em>)
{
//statements to handle the exception
}

La syntaxe pour lancer une OutOfMemoryException en C# est la suivante :

throw new OutOfMemoryException();

Dans l'instruction ci-dessus, « throw » est le mot-clé utilisé pour lancer des exceptions en C#.

Comment fonctionne OutOfMemoryException en C# ?

En C#, nous obtenons OutOfMemoryException lorsque notre programme n'a pas assez d'espace pour continuer son exécution. Il peut y avoir de nombreuses raisons pour lesquelles cette exception est accordée. Nous rencontrons également cette exception lorsqu'au total nous disposons de suffisamment d'espace pour que notre programme s'exécute mais que cet espace n'est pas contigu pour les allocations requises par notre programme. Les deux raisons majeures de cette exception sont les suivantes :

Essayer d'augmenter la longueur d'un objet StringBuilder au-delà de la longueur spécifiée par la propriété MaxCapacity de StringBuilder.

Nous obtiendrons l'exception disant "Mémoire insuffisante pour continuer l'exécution du programme."

  • Lorsque nous effectuons une affectation ou appelons une méthode qui nécessite une allocation de mémoire et qu'en même temps le CLR n'est pas en mesure de fournir suffisamment de mémoire contiguë pour notre allocation, nous obtiendrons OutOfMemoryException.

Les autres raisons qui peuvent devenir la cause de cette exception comprennent :

  • Exécuter l'application sur un système 32 bits qui ne dispose que de 2 Go de mémoire virtuelle, ce qui rend CLR difficile à fournir une mémoire contiguë pour les allocations requises par l'application.
  • Après avoir travaillé avec des ressources non gérées telles que des gestionnaires de fichiers, des connexions de base de données, des pointeurs, etc., si nous ne disposons pas de ces ressources, cela entraîne une fuite de mémoire qui dégrade les performances de notre application et peut conduire à OutOfMemoryException.
  • Travailler avec de grands ensembles de données nécessite une énorme quantité de mémoire et si CLR ne dispose pas de suffisamment d'espace contigu disponible, cela entraîne une exception OutOfMemoryException.
  • Les chaînes étant immuables, les opérations effectuées sur la chaîne créent une nouvelle chaîne dans la mémoire. Ainsi, si nous travaillons avec de grandes chaînes et si nous effectuons une opération de concaténation à plusieurs reprises sur la chaîne, cela peut conduire à plusieurs allocations de mémoire, ce qui dégradera les performances de notre application et peut devenir une cause d'OutOfMemoryException.
  • Si nous avons épinglé plusieurs objets dans la mémoire pendant une très longue période, il devient alors difficile pour le ramasse-miettes de fournir une allocation de mémoire contiguë à ces objets.

Exemples

Voici les exemples suivants mentionnés ci-dessous

Exemple n°1

Exemple montrant l'exception OutOfMemoryException levée par le programme lorsque nous essayons d'étendre l'objet StringBuilder au-delà de sa capacité maximale.

Code :

using System;
using System.Text;
public class Program
{
public static void Main()
{
StringBuilder stringBuilder = new StringBuilder(17, 17);
stringBuilder.Append("Welcome to the ");
try
{
stringBuilder.Insert(0, "world of C# programming", 1);
Console.WriteLine(stringBuilder.ToString());
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception.Message);
Console.ReadLine();
}
}
}

Sortie :

C# OutOfMemoryException

Exemple n°2

Exemple montrant un programme qui rencontre OutOfMemoryException en essayant d'ajouter l'élément dans la liste où le nombre d'éléments à ajouter est supérieur à la capacité de la liste.

Code :

using System;
using System.Text;
using System.Collections.Generic;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
try
{
string[] strArray = GetArray();
Console.WriteLine(strArray);
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
public static string[] GetArray()
{
List<string> strList = new List<string>();
for (int i = 0; i <= int.MaxValue; i++)
{
strList.Add("Hello");
}
return strList.ToArray();
}
}
}

Sortie :

C# OutOfMemoryException

Comment éviter OutOfMemoryException en C# ?

Nous pouvons éviter OutOfMemoryException en C# en gardant à l'esprit les points suivants :

  • Pour éviter cette exception lorsque nous travaillons avec StringBuilder, nous pouvons appeler le constructeur StringBuilder.StringBuilder(Int32, Int32) et définir la propriété MaxCapacity sur une valeur qui sera suffisamment grande pour servir l'hébergement requis lorsque nous développons le StringBuilder correspondant. objet.
  • Pour éviter cette exception lorsque nous travaillons sur un système 32 bits, nous pouvons recompiler notre application d'un système 32 bits à un système 64 bits dans Visual Studio en suivant les étapes ci-dessous :
  1. Barre de menus -> Construire -> Gestionnaire de configuration
  2. Cliquez sur la liste des plateformes de solutions actives et sélectionnez la plateforme 64 bits puis cliquez sur le bouton Fermer.

Si la plateforme 64 bits n'est pas disponible dans la liste alors :

  • Cliquez sur Nouvelle option dans la liste
  • Dans la fenêtre Nouvelle plateforme de solution, cliquez sur la liste « Tapez ou sélectionnez la nouvelle plateforme », puis sélectionnez l'option « x64 ».
  • Cliquez sur le bouton OK.
  • Pour éviter d'obtenir cette exception lorsque vous travaillez avec des ressources non gérées, nous devons toujours appeler la méthode Dispose() après avoir terminé notre travail avec la ressource non gérée qui n'est plus nécessaire.
  • Pour éviter cette exception lorsque nous travaillons avec de grands ensembles de données, nous devons essayer de filtrer les données, puis transmettre uniquement les données requises pour le traitement.
  • Pour éviter cette exception lorsque vous travaillez avec de grandes chaînes ou lors de l'exécution d'une concaténation de grandes chaînes, nous pouvons utiliser StringBuilder au lieu de string car StringBuilder est mutable et ne crée pas de nouvelle instance de la chaîne lorsque nous effectuons une opération dessus.

Conclusion

L'OutOfMemoryException est une exception d'exécution qui indique au programmeur qu'il n'y a pas assez de mémoire ou qu'il y a un manque de mémoire contiguë pour les allocations requises par le programme C#.

Pour éviter cette exception, l'utilisateur doit toujours prendre les précautions nécessaires et doit gérer cette exception.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:C# NullReferenceExceptionArticle suivant:C# NullReferenceException