LifeGames Forums

| O seu fórum de games, dicas, tutoriais, downloads, e muito mais


Você não está conectado. Conecte-se ou registre-se

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

Ir em baixo  Mensagem [Página 1 de 1]

AstriX

avatar
Admin
Admin
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:
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.

Código:
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;
Quem quiser se aprofundar no assunto pode ler o artigo do link abaixo:
Clicando aqui

Créditos
Agnaldo Carmo (pela descoberta e publicação do conteúdo)
AstriX (por trazer para a LifeGames e compartilhar com vocês)

Ver perfil do usuário

Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum