2010-08-04 10 views
5

Qualcuno può spiegare perché l'utilizzo di memoria di questa piccola app continua ad aumentare?L'app semplice con timer sta consumando memoria?

static class Program 
{ 
    private static System.Timers.Timer _TestTimer; 

    [STAThread] 
    static void Main() 
    { 
     _TestTimer = new System.Timers.Timer(); 
     _TestTimer.Interval = 30; 
     _TestTimer.Elapsed += new System.Timers.ElapsedEventHandler(_TestTimer_Elapsed); 
     _TestTimer.Enabled = true; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    static void _TestTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     string test = "tick"; 
     Trace.WriteLine(test); 
     test = null; 
    } 
} 

Grazie! Pika81

+0

Quanto velocemente stiamo parlando qui? – ChaosPandion

+0

Inoltre, l'utilizzo della memoria si stabilizza/si limita a un certo livello? – theburningmonk

+0

@Greg - Sai anche che non sappiamo cosa sta succedendo in 'Form1'. – ChaosPandion

risposta

1

Il mio suggerimento sarebbe quello di alzare lo Windbg e scoprire quali oggetti esistono in memoria.
accordo sul fatto che gli sviluppatori usano generalmente come l'ultima opzione ma in questo caso, si darebbe il motivo esatto per la memoria aumenta

+1

Quello o un bel profiler. – ChaosPandion

+0

Ho eseguito un profiler e GC viene eseguito dopo 5m30s e 14m14s. Le istanze di stringa sembrano essere pulite. Task Manager non è affidabile. –

1

mi stava scavando attraverso la fonte di DefaultTraceListener e ho trovato questo:

private void WriteLine(string message, bool useLogFile) 
{ 
    if (base.NeedIndent) 
    { 
     this.WriteIndent(); 
    } 
    this.Write(message + "\r\n", useLogFile); 
    base.NeedIndent = true; 
} 

Quindi l'utilizzo della memoria è probabilmente crescendo troppo lentamente per il GC di reagire immediatamente.

+0

+1 per la traccia di aggiunta. –

1

Se si sta solo guardando il Task Manager per vedere quanta memoria sta usando il processo, probabilmente non si ottiene una lettura molto accurata.

Avere una lettura di questo articolo: http://www.itwriting.com/dotnetmem.php

Spiega alcune delle carenze con l'utilizzo di TaskManager come un mezzo per misurare l'utilizzo della memoria della vostra applicazione .Net.

3

si stanno assumendo che l'utilizzo della memoria non dovrebbe aumentare. Presupposto errato, che è solo non come funziona il garbage collector .NET o il gestore di heap di Windows. Entrambi funzionano efficientemente usando la memoria che è disponibile per l'uso invece di rilasciare e riallocare costantemente la memoria.

Lasciarlo funzionare per una settimana. Potrebbe andare più veloce se rendi l'intervallo più piccolo. Riduci anche la forma per effetti spettacolari.

Problemi correlati