Inquiridor
Memoria da aplicação nao abaixa

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
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 :) -
É 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 -
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 -
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 -
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 :) -
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 -
-
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