2010-09-27 27 views
13

Come posso ottenere la memoria effettiva utilizzata nella mia applicazione C#?Utilizzo memoria C#

  • Task Manager mostra diverse metriche.
  • Process Explorer mostra un maggiore utilizzo di byte privati.
  • Contatore di prestazioni (perfmon.msc) ha mostrato metriche diverse
  • quando ho utilizzato il profiler di memoria .NET, ha mostrato che gran parte della memoria è raccolta di dati inutili e solo pochi byte attivi.

Non so a chi credere.

risposta

11

L'utilizzo della memoria è un po 'più complicato della visualizzazione di un singolo numero o due. Suggerisco di dare un'occhiata a Mark Russinovich's excellent post sui diversi tipi di contatori in Windows.

.NET complica ulteriormente le cose. Un processo .NET è solo un altro processo di Windows, quindi ovviamente avrà tutte le metriche regolari, ma in aggiunta a ciò il CLR funge da gestore della memoria per l'applicazione gestita. Quindi, a seconda del punto di vista, questi numeri possono variare.

Il CLR alloca in modo efficace e libera la memoria virtuale in grossi blocchi per conto dell'applicazione .NET e quindi distribuisce i bit di memoria all'applicazione secondo necessità. Pertanto, mentre la tua applicazione potrebbe utilizzare pochissima memoria in un dato momento, questa memoria potrebbe non essere stata rilasciata al sistema operativo.

Inoltre, il CLR stesso utilizza la memoria per caricare IL, compilare IL su codice nativo, memorizzare tutte le informazioni sul tipo e così via. Tutto ciò contribuisce all'impronta della memoria del processo.

Se si desidera conoscere la quantità di memoria utilizzata dall'applicazione gestita per i dati, è utile il contatore Bytes in all heaps. I byte privati ​​possono essere utilizzati come stima approssimativa per l'utilizzo della memoria dell'applicazione a livello di processo.

Si consiglia inoltre di controllare queste domande correlate:

Reducing memory usage of .NET applications?

How to detect where a Memory Leak is?

1

Scarica VADump (Se non si dispone ancora di esso)

Usage: VADUMP.EXE -sop [PID]

2

Se si sta utilizzando VS 2010 è possibile utilizzare Visual Studio 2010 Profiler. Questo strumento può creare per te report molto istruttivi.

+0

Ricordare che il profiler è disponibile solo nelle versioni più costose di VS. –

+0

sì @Brian Rasmussen ha ragione. Penso che solo VS Ultimate supporti Profiler. –

+0

Hai bisogno di VS 2010 premium o superiore (che è dispari, win7 prof >> home prem mentre vs2010 prem >> vs2010 prof) – atamanroman

1

Ebbene, ciò che è "la memoria effettivamente utilizzato nel mio C# applicazione"?

Grazie alla memoria virtuale e (diversi) livelli di gestione della memoria in Windows e CLR, questa è una domanda piuttosto complicata.

Dai sorgenti che hai citato il profiler CLR ti forniremo la descrizione più dettagliata, che definirei la più accurata.

Ma non esiste una risposta 'numero singolo', la domanda se l'applicazione A utilizza più o meno memoria di B può essere impossibile rispondere.

Quindi cosa vuoi sapere? Hai un problema prestazionale concreto da risolvere?

2

Se si desidera conoscere approssimativamente quanti byte sono allocati nell'heap del GC (ignorando la memoria utilizzata dal runtime, dal compilatore JIT, ecc.), È possibile chiamare GC.GetTotalMemory. L'abbiamo usato per rintracciare le perdite di memoria.