3 de ago. de 2015

Limpar memória de aplicações Delphi

Quando tempos aplicações de execução longa ou até mesmo aplicações que ficam minimizadas na barra de tarefas, não podemos deixar que essa aplicação gaste muita memória e acabe ficando lenta.

Se tivermos uma aplicação que precisa ficar rodando o dia inteiro para captura de algo, como por exemplo arquivos vindo de outras aplicações para processamento dentro de nossa aplicação.

Dependendo da aplicação não temos como saber a periodicidade com que chegaram os arquivos, então temos que estar lendo o repositório frequentemente e como não sabemos a periodicidade não faz sentido para a aplicação ficarmos fechando e abrindo a aplicação conforme ela for ficando lenta.




O Windows tem um modo bastante ineficiente de alocação de memória para seus processos. Reservando a memória em grandes blocos de forma significativa.

Delphi tem tentado minimizar este e tem sua própria arquitetura de gerenciamento de memória que utiliza blocos muito menores, mas isso é praticamente inútil no ambiente do Windows, porque a alocação de memória, em última análise recai sobre o sistema operacional.

Assim que o Windows atribuiu um bloco de memória para um processo, e esse processo libera 99,9% da memória, o Windows ainda vai reservar todo o bloco para estar em uso, mesmo que apenas um byte do bloco está realmente sendo usado. O shell nos fornece uma API chamada SetProcessWorkingSetSize. Aqui está a assinatura:

SetProcessWorkingSetSize( HProcess: HANDLE; MinimunWorkingSetSize : DWord; MaximumWorkingSetSize: DWord);


A função que utilizei na minha aplicação foi a seguinte:

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

Pense em como sua aplicação funciona e adapte a função para o melhor funcionamento


Nenhum comentário: