Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

klaygomes

Garbage Collection (em windows service)

Recommended Posts

E ai pessoal, boa tarde?

 

Estou com o seguinte problema:

Desenvolvi um pequeno windows service que inicia processo de importação de dados de uma base para outra em MySQL... Bem, até ai tudo bem, o problema fica na quantidade de memoria que este serviço esta consumindo!

 

Quando é carregado (antes de disparar a sequencia de importação) consome menos de 1MB e logo após chega a quase 90 MB's!!!

 

Para tentar sanar isto, inclui uma chamada ao metodo GC, só que isto não esta resolvendo...

 

O código do service se resume hoje a isto:

 

engine = new rotinasAtualizacao();				engine.ImportaRegistros();				engine = null;			System.GC.Collect();

A classe rotinasAtualizacao, é uma classe especializada que herda de mais outras 3 classes mais gerais

 

(Uma para conexão com servidor MySQL, outra para o servidor ARS e uma outra qeu possui algumas propriedades e metodos comuns as duas) e nada mais!!

 

Não entendo porque não esta voltando ao normal...

 

Alguém poderia me dar uma luz? Srá que existiria algum atributo, metodo, propriedade que fizesse isto para mim de uma forma mais eficiente?

 

Obrigado :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

você esta fechando as conexões? fechando os arquivos que esteja lendo?se usa o datareader feche ele com o .close() senão a conexão fica abertat++

Compartilhar este post


Link para o post
Compartilhar em outros sites

Otima pergunta...Sim claro, estou tomando cuidado em fechar todas as conexões que faço (para falar a verdade são apenas 3)...E tanto no Commands como noas conexões estou chamando Dispose para liberar os recursos...O que é mais estranho é que, com o passar do tempo a aplicação vai liberando memoria (agora por exemplo esta consumindo 10mb's)... Sei que o garbage collection esta fazendo o seu trabalho, só queria agilizar seu trabalho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou chegando lá...

 

Dei uma vasculhada na internet e cheguei isto:

rotinasAtualizacao engine = new rotinasAtualizacao();			  engine.ImportaRegistros();			  engine = null;[DllImport("kernel32.dll")]private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);GC.Collect();GC.WaitForPendingFinalizers();   if (Environment.OSVersion.Platform == PlatformID.Win32NT)		SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);

Agora o processo vai de 100Mbs para menos de 15 (apos a execução)... Só que ainda não esta bom =\

 

Será que tem como melhorar? ou é o máximo que eu vou conseguir? :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.