Ola pessoal, aconteceu isso comigo tambem algumas vezes, e descpbri neste site a baixo a solucao
http://www.agnaldocarmo.com.br/home/comando-milagroso-para-reducao-de-memoria-delphi/
que tambem informei abaixo o que esta neste site caso alguem nao consegue abrir o link
Caros colegas da comunidade Delphi, sabe quando realiza aquela descoberta e implementa aquela solução que você estava buscando a muito tempo? se você é programador deve saber, o que é poder dormir com aquele sentimento de realização, por poder implementar uma grande solução.
Hoje eu quero compartilhar um comando milagroso para aplicações Delphi 7… Não efetuei testes com versões superiores do Delphi mas pela arquitetura imagino que este problema também ocorre até com as versões mais recentes do Delphi. (conforme diversos comentários, esta solução se aplica as versões mais recentes do Delphi)
Quando você cria uma aplicação Delphi, tudo é um objeto, o Formulário é um objeto, cada objeto ocupa um espaço da memória gerenciado pelo programa após ser instanciado. E todo objeto após ser utilizado deve ser destruído para que esta memória seja liberada…
O que a maioria dos programadores não sabem é que, especificamente em Delphi que não existe “Coletor de Lixo de memória” como na plataforma .NET. Existe uma memória residual que nunca é liberada mesmo que você destrua todos os objetos que instanciar, porque é uma parta da memória que é administrada pelo próprio Sistema operacional. Se você deixar o seu aplicativo aberto, e efetuar diversas ações que interajam com as APIs do Windows ou DLL externas, trabalhar multi-camadas através de sockets…. Ou mesmo fazer movimentos simples como minimizar ou maximizar sua aplicação… Você perceberá que memória reservada no gerenciador de tarefas para o processo do seu executável crescerá. E muitos destes movimentos como maximiza e minimizar, exceções como já postei em posts anteriores é a parte não gerenciável da memória de sua aplicação pois ela ocorre na própria interação do Sistema Operacional com sua aplicação.
Desta maneira, sofríamos um problema sério na empresa onde trabalho, pois existem diversas aplicações que rodam como serviços, exemplo:
E o problema comum em todas estas aplicações era o mesmo, por mais que todos os objetes estivessem sendo liberados da memória, esta memória não parava de crescer… Devido ao escopo de memória não gerenciável que falei anteriormente.
E isso gerava um grande transtorno, pois estas aplicações de 3 megabytes chegavam a alcançar 2 giga de memória do servidor, obrigando a reinicialização da aplicação periodicamente.
Fazia-se necessário que a aplicação Delphi localiza-se o processo do Windows e libera-se toda a memória não mais necessária, descartável….
E é aí que descobrir o procedimento milagroso que interage com a API do Windows… para liberar a memória do aplicativa. Este comando é fantástico.
Este procedimento localiza o processo da aplicação, e limpa toda memória residual…
E como existe muita pouca documentação desta solução em português… decidi postar aqui.
Se sua aplicação for um Serviço, dll ou algo parecido basta remover a instrução Application.ProcessMessages;
Quem quiser se aprofundar no assunto pode ler o artigo do link abaixo:
http://delphi.about.com/od/windowsshellapi/ss/setprocessworkingsetsize-delphi-program-memory-optimize.htm