Comment faire pour identifier la mémoire des fuites dans le common language runtime

Traductions disponibles Traductions disponibles
Numéro d'article: 318263 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article décrit les listes et les fuites de mémoire sont certains causes possibles de fuites de mémoire. En outre, cet article traite de la fuite de mémoire perçue et comment elle peut être interprétée comme une fuite de mémoire true.

Plus d'informations

Fuites de mémoire peuvent provoquer une application s'exécute hors du ressources et peuvent provoquer un blocage. Il est important d'identifier fuites de mémoire. Le problème des fuites de mémoire a aident les développeurs en C et C++ pour les années. Dans Microsoft Visual Studio 2005 ou dans Microsoft Visual Studio .NET, un nettoyage complet package et mémoire managée peuvent cesser de fuites de mémoire, mais, dans certaines circonstances, un programme peut sembler être une fuite de mémoire.

Définition de fuite de mémoire

Une fuite de mémoire se produit lorsque la mémoire est allouée dans un programme et est jamais renvoyé au système d'exploitation, même si le programme n'utilise pas la mémoire plus longtemps. Voici les quatre types de base des fuites de mémoire :
  • Dans un environnement de mémoire gérée : la mémoire est dynamiquement allouées et référencés par un pointeur. Le pointeur est effacé avant la mémoire est libérée. Une fois que le pointeur est effacé, la mémoire ne peut plus être accessible et par conséquent ne peuvent pas être libérés.
  • Dans un environnement de mémoire gérée de manière dynamique : la mémoire est éliminés mais jamais perçus comme une référence à l'objet est toujours active. Dans la mesure où une référence à l'objet est toujours active, les poubelles collecteur collecte jamais que la mémoire. Cela peut se produire avec une référence est définie par le système ou le programme.
  • Dans un environnement de mémoire gérée de manière dynamique : les poubelles collecteur peut collecter et gratuitement la mémoire mais jamais renvoie à l'exploitation système. Cela se produit lorsque le garbage collector ne peut pas déplacer les objets qui sont toujours en utiliser pour une partie de la mémoire et libérer le reste.
  • Dans n'importe quel environnement de mémoire : gestion de la mémoire médiocre peut résultat lorsque de nombreux objets volumineux sont déclarés et jamais autorisés à quitter le champ d'application. Par conséquent, la mémoire est utilisé et jamais libérée.

Discussion

Car son le garbage collection qui est implémenté dans le.NET Framework de Microsoft, il n'est pas possible d'avoir une fuite de mémoire dans code managé. Cela suggère deux questions : Comment une fuite de mémoire peut survenir ? Pourquoi n'apparaît pas d'avoir une fuite de mémoire ?

Une fuite de mémoire peut se produire dans une application.NET Framework lors de l'utilisation de code non managé dans le cadre de l'application. Ce code non managé peut entraîner une fuite mémoire et la.NET Framework Runtime ne peut pas résoudre ce problème.

En outre, un projet peut seulement semble avoir une fuite de mémoire. Cette condition peut se produire si de nombreux grands objets (tels que les objets DataTable ) sont déclarées et puis ajoutés à une collection (par exemple, un groupe de données). Les ressources propres de ces objets ne peut jamais être libérée, et les ressources restent actives pour exécuter la totalité du programme. Il s'agit avoir une fuite, mais en réalité il est juste un symptôme de la façon dont la mémoire est en cours allouées par le programme.

Par exemple, vous avez un groupe de données. Chaque fois qu'une nouvelle requête est exécutée, vous ajoutez un nouvel élément de table de données à ce DataSet pour contenir les données retournées. S'il y a beaucoup de les données que vous supprimez jamais, les données restent actives tant que le groupe de données est en cours d'utilisation. Si cela se produit suffisamment de fois, il est possible mémoire insuffisante. Ce n'est pas une fuite de mémoire, mais au lieu de cela, il est un problème dans gestion de la mémoire. Consultez l'exemple de code suivant :
  Dim DS As DataSet
  Dim cn As New SqlClient.SqlConnection("data source=localhost;initial catalog=Northwind;integrated security=SSPI")
  cn.Open()
 
  Dim da As New SqlClient.SqlDataAdapter("Select * from Employees", cn)
  Dim i As Integer
  DS = New DataSet()

  For i = 0 To 1000
      da.Fill(DS, "Table" + i.ToString)
  Next
				
Remarque : Cet exemple est simplement un extrait de code. Cet exemple suppose que Ce Microsoft SQL Server est installé sur l'ordinateur local et que l'utilisateur qui exécute ce code a accès à la base de données Northwind fournie avec SQL Server.

Bien que Ce code est évidemment inefficace et pas pratique, il est destiné à prouver que si les objets sont ajoutés à une collection (par exemple en ajoutant le tables à la collection DataSet ), les objets restent actifs tant que le collection reste active. Si une collection est déclarée au niveau global de le programme et les objets sont déclarés dans tout le programme et ajouté à celui collection, cela signifie que même si les objets sont hors de portée, le les objets restent actifs car ils sont toujours référencés.

Chaque heure dans ce cas, la quantité de mémoire à l'aide du programme augmente. La mémoire ne diminue pas jusqu'à la fin du programme ou le libération des objets de la collection. Lorsque vous regardez le programme sur un l'Analyseur de performances, cela semble être une fuite de mémoire, mais il n'est pas. Le programme toujours peut contrôler la mémoire mais a choisi de ne pas le libérer. Le fait que le programme a encore contrôle cela empêche d'être une fuite de mémoire mais le fait que le programme continue d'augmenter la quantité de mémoire utilisée peut Assurez-vous qu'il semble être une fuite de mémoire.

Problèmes de fuite de mémoire

Lorsque la quantité de mémoire à l'aide d'un programme continue à augmenter pendant l'exécution, il s'agit d'un symptôme d'une fuite de mémoire. (Vous pouvez Regardez ce compteur de mémoire par le biais de l'Analyseur de performances). La quantité de mémoire le programme utilise peut éventuellement causer le programme s'exécute plus de ressources et de tomber en panne.

Références

Voici une liste de rubriques d'aide pour plus d'informations à propos de la mémoire et de gestion :
  • Classe GC
  • Compteurs de Performance de mémoire
  • Gestion automatique de la mémoire
  • Interopérabilité avec du Code non managé
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
317297Introduction au débogage se bloque, des fuites de mémoire, des blocages et des conditions de concurrence critique dans Visual Basic .NET
Pour plus d'informations, visitez le site Microsoft suivant Developer Network (MSDN) Web sites :
http://msdn.Microsoft.com/en-us/library/x98tx3cf.aspx

http://msdn.Microsoft.com/en-us/library/fz5w87ad.aspx

http://msdn.Microsoft.com/en-us/library/kxx6e7z6.aspx

http://msdn.Microsoft.com/en-us/library/s3aw423e.aspx

Propriétés

Numéro d'article: 318263 - Dernière mise à jour: dimanche 4 novembre 2012 - Version: 6.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio .NET 2003 Professional
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Éducation
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Éducation
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual C++ .NET 2003 Initiation
  • Microsoft Visual C++ .NET 2002 Initiation
  • Microsoft Visual C# .NET 2003 Initiation
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft Visual J# .NET 2003 Initiation
Mots-clés : 
kbvs2005swept kbvs2005applies kbinfo kbmt KB318263 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 318263
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com