Aumento do Tam. do Executável
03/03/2006
0
Estou enfrentando um problema sério de [b:0b3ab32e29]aumento de uso de memória[/b:0b3ab32e29] do meu aplicativo, e isso está me deixando [b:0b3ab32e29]preocupado[/b:0b3ab32e29]. Já ouvi falar bastante que [u:0b3ab32e29]não devemos destruir objetos[/u:0b3ab32e29] na mão com [u:0b3ab32e29]FreeAndNil[/u:0b3ab32e29] no momento de descarregar o objeto pai da memória (evento destroy) isso quem fica responsável é o objeto pai apartir do [b:0b3ab32e29]método Create(<NomeDoComponente>)[/b:0b3ab32e29] onde [b:0b3ab32e29]<NomeDoComponente>[/b:0b3ab32e29] seria o cara que limpa o objeto da memória. Bem, não sei se consegui me explicar direito mas como exemplo poderia destacar um form pai e um form filho. O form pai com uma chamada para o form filho [b:0b3ab32e29](este cheio de componentes)[/b:0b3ab32e29] onde a criação do form filho e feita no braço com create e não createform. Assim fiquei observando o tamanho do executável na memória pelo [b:0b3ab32e29]Task Manager do windows[/b:0b3ab32e29] e notei que a cada vez que abria o form filho o executável aumentava e quando fechava ele [b:0b3ab32e29]não diminuía[/b:0b3ab32e29]. Bem, gostaria então que alguém pudesse me responder se isso está certo ou se existe algum problema na maneira que estou programando. Obrigado pela atenção.[/b]
Edvilson.chaves
Posts
03/03/2006
Massuda
Na verdade, quando seu programa é encerrado, praticamente toda a memória que ele utilizou é liberada pelo sistema operacional.
Se quiser saber se seu programa está deixando para trás memória sem ser liberada, use, por exemplo, o [url=http://fastmm.sourceforge.net]FastMM[/url] (open source) em modo de debug.
03/03/2006
Edvilson.chaves
03/03/2006
Massuda
Um dos motivos que a informação do Gerenciador de Tarefas estar errada é que um programa em Delphi aloca memória do Windows indiretamente; todo programa Delphi aloca memória através de um gerenciador de memória da Borland.
Em linha gerais, o gerenciador não devolve totalmente ao Windows a memória que você alocou porque ele imagina que você vai requisitar novamente mais memória. Isso é feito para otimizar os tempos de alocação de memória.
Um jeito simples de ver quanto de memória seu programa está efetivamente utilizando: coloque no seu form principal um timer e no evento OnTimer inclua o seguinte...
procedure TSeuForm.Timer1Timer(Sender: TObject); var Blocos: Cardinal; Bytes: Cardinal; begin Blocos := AllocMemCount; Bytes := AllocMemSize; Caption := Format(´¬s (¬d blocos - ¬d bytes)´, [Application.Title, Blocos, Bytes]) end;
06/08/2006
Raserafim
crio todos os meus forms em tempo de execução
Application.CreateForm(TFrmVendedores, FrmVendedores) FrmVendedores.Show;
e no OnClose dos forms coloco
Action := caFree.
observando o resultado com o seu código aconteceu o seguinte:
abro a aplicação: 22890 blocos | 1716272 bytes
abro cad clientes: 25962 blocos | 2055464 bytes
fecho cad clientes: 23679 blocos | 1876976 bytes
abro cad clientes: 25962 blocos | 2055476 bytes
fecho cad clientes: 23679 blocos | 1877049 bytes
abro cad clientes: 25962 blocos | 2054564 bytes
fecho cad clientes: 23679 blocos | 1876880 bytes
resumindo:
quando abro o cadastro de clientes o número de blocos vai sempre para o mesmo, e quando fecho também vai sempre para o mesmo.
o que posso tomar de conclusão disso? que está sendo destruido corretamente tudo o que foi criado? o que significa na verdade blocos?
com os bytes tem uma pequena variação mas não é sempre crescente. gira sempre em torno do mesmo valor, um pouquinho a mais ou um pouquinho a menos.
o que posso interpretar? o que significa realmente estes bytes? não deveria ocorrer o mesmo que os blocos, sendo sempre iguais?
06/08/2006
Massuda
08/08/2006
Raserafim
não deveria voltar aos do início da aplicação?
08/08/2006
Raserafim
devo desprezar esta análise e ficar só com o resultado do seu código?
08/08/2006
Massuda
Vamos imaginar que quando inicia tem 100 blocos. Aí você abre algum form e precisa de mais 20 blocos... sua aplicação está usando 120 blocos. Quando você fecha o form, o Delphi pega os 20 blocos extras e ´marca´ eles como disponíveis; sua aplicação continua usando 120 blocos. Imagine que você abre outro form que precisa de 10 blocos; como tem 20 disponíveis, o Delphi não pede memória para o Windows, ele usa 10 dos 20 disponíveis.
Por outro lado, o código que postei mede a quantidade de memória que foi alocada através do Delphi; ela não conta memória que eventualmente algum código seu aloque diretamente do Windows (via API).
Clique aqui para fazer login e interagir na Comunidade :)