Reducao de Memoria na Aplicacao

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)

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:

Servidor de Aplicação Multi-camadas

Serviços de webservices, para integrações com sistemas web

Serviços de webservices para geração de relatórios ReportBuild (PDFs) compartilhados com outras aplicações web (java e .NET).

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.

procedure TrimAppMemorySize;
var
MainHandle : THandle;
begin
try
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
CloseHandle(MainHandle) ;
except
end;
Application.ProcessMessages;
end;

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;

Voce pode usar este comando em substituíção ao Application.ProcessMessages, já que a própria rotna em sí, chama o 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

 

Link do material

Comando milagroso para redução de memória Delphi

 

Autor: Alessandro Pancotte

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s