none
Memoria da aplicação nao abaixa RRS feed

  • Pergunta

  • Vou demonstrar meu problema com o seguinte exemplo:

    Criei uma aplicacao Windows Forms com o seguinte código

     

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;

    namespace WindowsFormsApplication25
    {
        public partial class Form1 : Form
        {
            List<int> lst;

            public Form1()
            {
                InitializeComponent();

                lst = new List<int>();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < 9999999; i++)
                    lst.Add(i);
            }

            private void button2_Click(object sender, EventArgs e)
            {
                lst = new List<int>();
            }
        }
    }

     

    qdo clico no button1 ele garreda a lista e eleva a memoria para mais ou menos 85 megas, após isso clico no button2 no qual instancia novamente a classe, porém o consumo de memoria nao abaixa no Task Manager. Se eu aplico o GC.Collect(); após instanciar a lst imediatamenteo abaixa a memoria mas sei que é recomendado deixar o GC trabalhar do jeito dele.

    Este foi um exemplo bem simples.

    Desd já agradeço a ajuda.

     


    Icaro Ferreira Analista Programador
    sexta-feira, 3 de fevereiro de 2012 21:22

Todas as Respostas

  • Amigo, quando você for testar sua aplicação visando o consumo de memória, tente alterar o modo de compilação dela de DEBUG p/ RELEASE e veja se teve diferença;

     

    Quando você compila em modo RELEASE, são feitos ajustes para melhoria no consumo de memória e perfomance da aplicação.


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)
    segunda-feira, 6 de fevereiro de 2012 11:36
    Moderador
  • É um consumo bem expressivo de memória para uma aplicação tão simples, faça o profiling do código através do Visual Studio para confirmar o momento de pico no uso da memória.

    http://msdn.microsoft.com/en-us/magazine/cc337887.aspx


    Rodrigo Reis Ferreira
    Microsoft Certified
    segunda-feira, 6 de fevereiro de 2012 11:52
  • Obrigado pela dica Olavo mas já tinha feito o teste mudando pra Release.

    O que me chamou mais atenção é que se o código abaixo é aplicado a memória cai praticamente igual a quando ela iniciou.

     private void button2_Click(object sender, EventArgs e)
            {
                lst = new List<int>();
                GC.Collect();
            }


    Icaro Ferreira Analista Programador
    segunda-feira, 6 de fevereiro de 2012 12:30
  • Ola Rodrigo, a quetão nem seria o consumo expressivo de memória mas sim mesmo eu instanciando a lista novamente a memória nao abaixar e cada vez que a lista é preenchida novamente a memoria vai só subindo.

    Icaro Ferreira Analista Programador
    segunda-feira, 6 de fevereiro de 2012 12:32
  • Amigo, você já tentou informar o tamanho da list que será preenchida ?

    lst = new List<Int32>(999999);
                for (Int32 i = 0; i < 999999; i++)
                    lst.Add(i);
    



    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)
    segunda-feira, 6 de fevereiro de 2012 13:09
    Moderador
  • Nao tinha testado, acabei de testar e quando é informado a capacidade da lista diminuiu de 80 pra 50 Megas porém é inviável para uma aplicação pois na maioria das vezes não sei qual vai ser o tamanho da lista antes de alimenta-la.

    Mesmo assim, após instanciar a lista novamente continua com consumo elevado de memoria.

    Lembrando que o exemplo que dei é bem simples, nao necessariamente precisa ser com uma lista. O problema que tenho é que meu software WindowsForms não está diminuindo a memoria no decorrer da sua utilização.


    Icaro Ferreira Analista Programador
    segunda-feira, 6 de fevereiro de 2012 13:22
  • Icaro, o projeto é isolado ou ele tem pendências associadas? É um projeto vazio só com esse código ai?
    Rodrigo Reis Ferreira
    Microsoft Certified
    segunda-feira, 6 de fevereiro de 2012 13:32
  • Então Rodrigo é o seguinte, na verdade como disse na descricao do meu problema é um exemplo mto simples porem o objetivo não é descobrir pq a lista fica na memoria mas sim descobrir porque os objetos (classes (model, regras de negocio), telas, listas, etc)  ficam na memória mesmo após estar sendo instanciado e não será mais utilizada. Outra questão é que se o GC é chamado para fazer a coleta via código a memoria abaixa de imediato.

    No projeto que estou tendo este problema é um projeto muito grande mas para nao enrolar mto tentei criar um exemplo simples para ficar facil de entender.

     


    Icaro Ferreira Analista Programador
    segunda-feira, 6 de fevereiro de 2012 13:45