Al momento sei offline in attesa che la connessione Internet venga ristabilita

Come identificare la memoria delle perdite in common language runtime

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 318263
Sommario
In questo articolo vengono illustrate le perdite di memoria sono e sono elencate alcune cause possibili perdite di memoria. Questo articolo viene inoltre spiegato la perdita di memoria percepita e come è possibile essere erroneamente interpretata come una perdita di memoria true.
Informazioni
Perdite di memoria possono causare l'esecuzione di esaurimento delle risorse di un'applicazione e possono causare l'arresto anomalo di un'applicazione. È importante identificare perdite di memoria. Il problema di memoria è tormentato gli sviluppatori in C e c ++ per anni. In Microsoft Visual Studio 2005 o in Microsoft Visual Studio. NET, un pacchetto di insieme di garbage completa e la memoria gestita è possibile evitare perdite di memoria, ma in alcuni casi, un programma sembra di perdite di memoria.

Definizione di perdita di memoria

Perdita di memoria quando memoria viene allocata in un programma e non viene mai restituito al sistema operativo, anche se il programma non utilizza più la quantità di memoria. Di seguito sono quattro tipi principali di perdite di memoria:
  • In un ambiente di memoria gestita manualmente: memoria in modo dinamico è allocato e a cui fa riferimento un puntatore. Il puntatore verrà cancellato prima che la memoria viene liberata. Dopo il puntatore viene cancellato, la memoria non è possibile accedere e pertanto non può essere liberata.
  • In un ambiente di memoria gestita in modo dinamico: memoria viene eliminato ma non raccolti, perché un riferimento all'oggetto è ancora attivo. Poiché un riferimento all'oggetto è ancora attivo, il garbage collector raccoglie non che la memoria. Questo problema può verificarsi con un riferimento impostato dal sistema o il programma.
  • In un ambiente di memoria gestita in modo dinamico: il garbage collector può raccogliere e disponibile la memoria ma mai lo restituisce al sistema operativo. Questo problema si verifica quando il garbage collector non può spostare gli oggetti che sono ancora in utilizzare per una parte della memoria e libero il resto.
  • In qualsiasi ambiente di memoria: memoria insufficiente può causare la gestione quando molti oggetti di grandi dimensioni vengono dichiarati e non è consentiti lasciare l'ambito. Di conseguenza, memoria viene utilizzato e mai liberata.

Discussione

A causa del pacchetto insieme garbage che viene implementato in Microsoft .NET Framework, non è possibile disporre di una perdita di memoria nel codice gestito. Ne consegue che due domande: come quindi può verificarsi una perdita di memoria? Perché viene visualizzato di disporre di una perdita di memoria?

Quando si utilizza codice non gestito come parte dell'applicazione, una perdita di memoria può verificarsi in un'applicazione .NET Framework. Questo codice non gestito è una perdita di memoria e .NET Framework runtime non può risolvere questo problema.

Inoltre, un progetto potrebbe essere visualizzato solo una perdita di memoria. Questa condizione può verificarsi se molti oggetti di grandi dimensioni (ad esempio oggetti DataTable ) sono dichiarati e quindi aggiunto a un insieme (ad esempio un DataSet ). Le risorse che possiedono questi oggetti non possono essere rilasciate e le risorse rimangono attive per l'intero eseguite del programma. Sembra trattarsi di una perdita, ma effettivamente è solo un sintomo di quella di memoria allocata nel programma.

Ad esempio, è necessario un DataSet . Ogni volta che viene eseguita una nuova query, si aggiunge un nuovo elemento di DataTable a tale DataSet per contenere i dati che viene restituiti. Se non esistono grandi quantità di dati che non di cessione di, i dati rimane attivi fino a quando il DataSet è ancora in uso. In questo caso, numero di volte sufficiente, è possibile esaurimento della memoria. Non si tratta di una perdita di memoria, ma invece è un problema di gestione della memoria. Vedere il seguente codice di esempio:
  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				
Nota questo esempio è solo un frammento di codice. Nell'esempio si presuppone che Microsoft SQL Server sia installato nel computer locale e che l'utente che esegue il codice disponga di accesso al database Northwind incluso in SQL Server.

Anche se questo codice è ovviamente inefficiente e poco pratica, è destinato a dimostrare che se gli oggetti vengono aggiunti a un insieme (ad esempio aggiungere le tabelle DataSet insieme), gli oggetti vengono tenuti attivi, purché l'insieme rimane attivo. Se un insieme viene dichiarato a livello globale del programma e dichiarati nel programma e aggiunta a, che insieme, questo significa che anche se gli oggetti non sono nell'ambito degli oggetti, gli oggetti rimangono attivi perché sono ancora riferimento.

Ogni volta che in questo caso, la quantità di memoria che il programma utilizza aumenta. La memoria non diminuisce fino a fine del programma o il rilascio degli oggetti dall'insieme. Quando si guarda il programma su un monitor delle prestazioni, questo sembra essere una perdita di memoria, ma non è. Comunque, il programma dispone di controllo la quantità di memoria ma ha scelto di non rilascio. Il fatto che il programma dispone ancora di controllo si impedisce il da una perdita di memoria, ma il fatto che il programma consente di mantenere l'aumento della memoria utilizzata può rendere sembra essere una perdita di memoria.

Sintomi di memoria

Quando la quantità di memoria che utilizza un programma continua a aumentare durante l'esecuzione, questo è un sintomo di un problema di memoria. (È possibile controllare il conteggio di memoria tramite performance monitor). La quantità di memoria utilizzato dal programma può infine causare l'eseguire esaurito le risorse e per arresto anomalo del sistema.
Riferimenti
Di seguito è un elenco degli argomenti della Guida per ulteriori informazioni sulla memoria e la gestione:
  • Classe GC
  • Contatori di prestazioni memoria
  • Gestione automatica della memoria
  • Interoperabilità con codice non gestito
Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
317297Guida di orientamento per il debug si blocca, perdite di memoria, blocchi critici (deadlock) e race condition in Visual Basic .NET
Per ulteriori informazioni, visitare il seguente sito Web Microsoft Developer Network (MSDN):
CLR

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 318263 - Ultima revisione: 12/06/2006 23:18:59 - Revisione: 4.7

Microsoft Common Language Runtime (included with the .NET Framework) 1.0, Microsoft Common Language Runtime (included with the .NET Framework 1.1), Microsoft Visual Studio 2005 Standard Edition, Microsoft Visual Studio 2005 Professional Edition, Microsoft Visual Studio .NET 2003 Professional Edition, Microsoft Visual Studio .NET 2003 Enterprise Architect, Microsoft Visual Studio .NET 2003 Enterprise Developer, Microsoft Visual Studio .NET 2003 Academic Edition, 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 Academic Edition, Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition

  • kbmt kbvs2005swept kbvs2005applies kbinfo KB318263 KbMtit
Feedback