2010-08-04 7 views
5

¿Alguien puede explicar por qué el uso de la memoria de esta pequeña aplicación sigue aumentando?¿La aplicación simple con temporizador está consumiendo la 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; 
    } 
} 

¡Gracias! Pika81

+0

¿Qué tan rápido estamos hablando aquí? – ChaosPandion

+0

Además, ¿el uso de memoria se estabiliza/limita en un cierto nivel? – theburningmonk

+0

@Greg - Sabes que tampoco sabemos qué está pasando en 'Form1'. – ChaosPandion

Respuesta

1

Mi sugerencia sería poner en cero Windbg y averiguar qué objetos existen en la memoria.
Estamos de acuerdo en que los desarrolladores generalmente lo utilizamos como la última opción, pero en este caso, le daría la razón exacta para aumentar la memoria

+1

Eso o un buen generador de perfiles. – ChaosPandion

+0

Ejecuté un generador de perfiles y GC funciona después de 5m30s y 14m14s. Las instancias de cadena parecen limpiarse. El Administrador de tareas no es confiable. –

1

que estaba excavando a través de la fuente de DefaultTraceListener y me encontré con esto:

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

lo tanto, el uso de la memoria es, probablemente, creciendo demasiado lentamente para la GC para reaccionar de inmediato.

+0

+1 para el Trace adjunto. –

1

Si solo está mirando al Administrador de tareas para ver cuánta memoria está usando su proceso, probablemente no obtenga una lectura muy precisa.

tener una lectura de este artículo: http://www.itwriting.com/dotnetmem.php

Explica algunas de las deficiencias con el uso de administrador de tareas como un medio para medir el uso de la memoria de su aplicación .Net.

3

Está asumiendo que el uso de la memoria no debería aumentar. Suposición incorrecta, eso es solo no cómo funcionan el recolector de basura .NET o el administrador de montón de Windows. Ambas funcionan de manera eficiente mediante el uso de la memoria que está disponible para su uso en lugar de liberar y reasignar constantemente la memoria.

Que funcione durante una semana. Podría ir más rápido si reduce el intervalo. También minimice la forma de efectos espectaculares.

Cuestiones relacionadas