Array
(
)

Aumento do Tam. do Executável

Edvilson.chaves
   - 03 mar 2006

Olá Pessoal!

Estou enfrentando um problema sério de aumento de uso de memória do meu aplicativo, e isso está me deixando preocupado. 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 método Create(<NomeDoComponente>) onde <NomeDoComponente> 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 (este cheio de componentes) 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 Task Manager do windows e notei que a cada vez que abria o form filho o executável aumentava e quando fechava ele não diminuía. 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.


Massuda
   - 03 mar 2006


Citação:
...fiquei observando o tamanho do executável na memória pelo Task Manager do windows
Por motivos técnicos, o Gerenciador de Tarefas não é a melhor forma de medir o consumo de memória do seu programa.

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.


Edvilson.chaves
   - 03 mar 2006

Mas, Massuda e quando ao uso de memória enquanto o executável estiver rodando ao carregar um form e depois descarregá-lo o tamanho de memória deveria diminuir e isso não ocorre. Qual a prática que vc está utilizando, eu olhei sobre o metodo Release ele foi criado para isso? E gostaria de saber realmente qual a melhor prática para limpar a memória qdo eu fechar um form ou um datamodule (método Close).


Massuda
   - 03 mar 2006

Imagino que você está afirmando isso baseado no que vê no Gerenciador de Tarefas.

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...#Código

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;



Raserafim
   - 06 ago 2006

Massuda, coloquei o código que vc citou em meu aplicativo para ver como anda o consumo de memória, e aconteceu o seguinte.
crio todos os meus forms em tempo de execução
#Código


Application.CreateForm(TFrmVendedores, FrmVendedores)
FrmVendedores.Show;

e no OnClose dos forms coloco
#Código

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?


Massuda
   - 06 ago 2006


Citação:
o que posso tomar de conclusão disso? que está sendo destruido corretamente tudo o que foi criado
Sim.


Citação:
o que significa na verdade blocos?
Bloco é um bloco de bytes, a menor quantidade de bytes que o Delphi aloca; por exemplo, quando você aloca 4 bytes, o Delphi aloca um bloco, que pode corresponder (por exemplo) a 32 bytes.


Raserafim
   - 08 ago 2006

e o que significa esta diferença de quando abro a aplicação (22890 blocos) para depois que abro e fecho o cadastro de clientes (23679 blocos)
não deveria voltar aos do início da aplicação?


Raserafim
   - 08 ago 2006

analisando o gerenciador do windows (que vc já disse que não é aconselháve) a cada vez que abro e fecho o cadastro de clientes a quantidade de memória consumida vai cada vez mais aumentando.
devo desprezar esta análise e ficar só com o resultado do seu código?


Massuda
   - 08 ago 2006


Citação:
e o que significa esta diferença de quando abro a aplicação (22890 blocos) para depois que abro e fecho o cadastro de clientes (23679 blocos) não deveria voltar aos do início da aplicação?
Não necessariamente.

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.


Citação:
analisando o gerenciador do windows (que vc já disse que não é aconselháve) a cada vez que abro e fecho o cadastro de clientes a quantidade de memória consumida vai cada vez mais aumentando. devo desprezar esta análise e ficar só com o resultado do seu código?
A grosso modo, o medidor do Windows mede o máximo de memória seu programa alocou, não o quanto ele está usando; para piorar a memória que é liberada de volta para o Windows mas não foi utilizada por outro aplicativo ainda aparece nesse total (essa memória disponível é considerada pelo Windows como disponível para uso pelo seu programa, embora ela possa ser usada por qualquer programa).

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).


Raserafim
   - 10 ago 2006

explicado,

valeu massuda