2012-10-15 15 views
5

Ho scritto un lungo socket server di connessione TCP in C#. Spike in memoria nel mio server succede. Ho usato dotNet Memory Profiler (uno strumento) per rilevare la perdita di memoria. Memory Profiler indica che l'heap privato è enorme e la memoria è qualcosa di simile (il numero non è reale, quello che voglio mostrare è GC0 e GC2 Gli spazi sono molto enormi, la dimensione dei dati è normale):Cosa sono i fori GC?

Managed heaps - 1,500,000KB 
      Normal heap - 1400,000KB 
       Generation #0 - 600,000KB 
        Data - 100,000KB 
        "Holes" - 500,000KB 
       Generation #1 - xxKB 
        Data - 0KB 
        "Holes" - xKB 
       Generation #2 - xxxxxxxxxxxxxKB 
        Data - 100,000KB 
        "Holes" - 700,000KB 
      Large heap - 131072KB 
       Large heap - 83KB 
       Overhead/unused - 130989KB 
      Overhead - 0KB 

Howerver, qual è il foro del GC? documention di dotNet Memory Profiler definito i "buchi":

“buchi” rappresentano la memoria che è inutilizzato tra due assegnate istanze. I "buchi" vengono visualizzati quando l'heap non è completamente compattato, a causa delle istanze o delle ottimizzazioni aggiunte nel garbage collector di .

Quello che voglio sapere è:

  1. "buchi" appaiono tra ciò che tipo di due istanze assegnate?
  2. che tipo di istanze sono bloccate?
  3. Come compattare l'heap?

Spero che qualcuno possa spiegarlo.

+2

Sospetto che l'articolo riguardi un diverso tipo di foro. – CodesInChaos

+4

"I" buchi "rappresentano la memoria non utilizzata tra due istanze allocate." Fori "vengono visualizzati quando l'heap non è completamente compattato, a causa di istanze bloccate o ottimizzazioni nel garbage collector." [Dalla documentazione di .NET Memory Profiler] (http://memprofiler.com/onlinedocs/default.htm?turl=managedheaps.htm) – CodesInChaos

+2

Perché ci sono così tante persone che invitano questa domanda? La domanda dell'autore non è chiara. Sulla base della modifica sembra anche che non abbia idea di cosa stia parlando. –

risposta

4

A pinned object è uno che non può spostarsi in memoria. Questo è spesso necessario quando si lavora con codice non gestito che richiede di passare un puntatore a qualche struttura in memoria: per impostazione predefinita il garbage collector è libero di spostare quella struttura in modo da gestire al meglio la memoria, tuttavia se lo fa quando si ' dato un codice non gestito a un puntatore a quella struttura, se viene spostato quel codice non gestito non punterà più alla struttura corretta, portando a un comportamento imprevisto.

La soluzione è "appuntare" quell'oggetto per dire al GC che non dovrebbe spostarlo.

Non è possibile compattare in modo esplicito l'heap, il GC deve eseguire questa operazione quando esegue una raccolta completa o parziale (ad eccezione dello LOH): bloccare molti oggetti renderà più difficile la gestione corretta di questo però. Per ulteriori dettagli sul GC vedi Garbage Collector Basics and Performance Hints

+1

Vale la pena notare che le connessioni di rete sono in genere risorse umanizzate, quindi se il "socket server di connessione TCP" del richiedente non gestisce le sue connessioni con molta attenzione e gestisce un numero elevato di connessioni, questa potrebbe essere la causa di un gran numero di oggetti appuntati. –

+0

Tutte le prese sono chiuse dopo l'uso. Penso che ci siano altre risorse non gestite allocate e non disposte. – tianyi