Medir memória em uso pelo programa
[color=red:d2977d544f]Tópico editado por Massuda
Este tópico foi formado a partir de posts feitos em outro tópico abordando assunto diferente do original:
http://forum.clubedelphi.net/viewtopic.php?t=82852[/color:d2977d544f]
Se voce programa com POO tenho duas dicas, se não tem que analisar o codigo no create e no show do form
1ª dica :
recomendo que utilize esta rotina em um timer e coloque em um label
[color=green:d2977d544f]
if(AllocMemCount > 0)then
Label.Caption := IntToStr(AllocMemCount)
else
Label.Caption := ´Nulo´;
[/color:d2977d544f]
o codigo acima te mostra quantos objetos o sistema esta aberto na memória provavelmente voce deve estar com uma quantidade grande.
o meu sistema so de ficar aberto tem 10.000 objetos na memória pode parecer até muito mais não é.
2ª dica:
Não trabalhe com List sim com TOBjectList pois ao destruir a List o delphi não destroi os objetos contido nela ja TObjectList destroi para funcionar adicione na uses ´Contnrs´.
Leonardobhbr
Curtidas 0
Respostas
Brasidata
07/12/2006
Amigo Leonardo,
Gostei muito da sua ideia para monitorar os objetos em memória, porém andei testando a rotina em uns sistemas meus e OU meus sistemas são fantasmas ou tem algum erro na rotina acima, Afinal o label não sai do NULO. Tem varias rotinas rodando no mesmo timer, todas funcionando normalmente e atualizando a cada segundo e mesmo assim o caption do label atualiza pra NULO e não sai mais disso...
Gostei muito da sua ideia para monitorar os objetos em memória, porém andei testando a rotina em uns sistemas meus e OU meus sistemas são fantasmas ou tem algum erro na rotina acima, Afinal o label não sai do NULO. Tem varias rotinas rodando no mesmo timer, todas funcionando normalmente e atualizando a cada segundo e mesmo assim o caption do label atualiza pra NULO e não sai mais disso...
GOSTEI 0
Leonardobhbr
07/12/2006
Voce tem certeza que não funcionou faz em um sisteminha do zero para voce ve cria uma classe e vai dando create que concerteza funciona
[color=green:e7317588f2]
if(AllocMemCount > 0)then
Label1.Caption := IntToStr(AllocMemCount)
else
Label1.Caption := ´Nulo´;
[/color:e7317588f2]
se quiser eu te mando o exemplo só passar seu email
[color=green:e7317588f2]
if(AllocMemCount > 0)then
Label1.Caption := IntToStr(AllocMemCount)
else
Label1.Caption := ´Nulo´;
[/color:e7317588f2]
se quiser eu te mando o exemplo só passar seu email
GOSTEI 0
Massuda
07/12/2006
Se o BD está numa máquina e seu programa em outra, pode ser um problema de rede ou rede ´congestionada´.
@Leonardobhbr
[b:847f4febfd]AllocMemCount[/b:847f4febfd] mostra quantos blocos de memória o gerenciador de memória alocou do Windows.
Você pode usar [b:847f4febfd]AllocMemSize[/b:847f4febfd] para saber quantos bytes de memória estão em uso.
@Leonardobhbr
[b:847f4febfd]AllocMemCount[/b:847f4febfd] mostra quantos blocos de memória o gerenciador de memória alocou do Windows.
Você pode usar [b:847f4febfd]AllocMemSize[/b:847f4febfd] para saber quantos bytes de memória estão em uso.
GOSTEI 0
Leonardobhbr
07/12/2006
@Massuda
Boa lembrança do ´AllocMemSize´
Boa lembrança do ´AllocMemSize´
GOSTEI 0
Brasidata
07/12/2006
@leonardobhbr
Pois é..
Criei um projeto do zero e não funcionaou mesmo.
Uso o Delphi 2006, mas não acho que isso seja relevante.
O debug mostra o seguinte aviso quando eu compilo (mas não atrapalha em nada a compilação) :
Se não for pedir muito, será que vc poderia fazer um mini exemplo e me mandar o fonte (pode ser pro email) pra eu ver funcionando?.. Estou realmente curioso e interessado nesse recurso.
Desde já agradeço
Pois é..
Criei um projeto do zero e não funcionaou mesmo.
Uso o Delphi 2006, mas não acho que isso seja relevante.
O debug mostra o seguinte aviso quando eu compilo (mas não atrapalha em nada a compilação) :
[Pascal Warning] FUNCOES.pas(230): W1000 Symbol ´AllocMemSize´ is deprecated
Se não for pedir muito, será que vc poderia fazer um mini exemplo e me mandar o fonte (pode ser pro email) pra eu ver funcionando?.. Estou realmente curioso e interessado nesse recurso.
Desde já agradeço
GOSTEI 0
Leonardobhbr
07/12/2006
@brasidata
A mensagem que o delphi da significa que não e pra utilizar esta variavel mais pois ela é obsoleta por isto que esta vindo sempre nulo se vc clicar na variavel e apertar a tecla control provavelmente deve ter um comentario na linha explicando qual é a variavel que deve ser usada.
Como eu utilizo o Delphi7 isto funciona perfeitamente
A mensagem que o delphi da significa que não e pra utilizar esta variavel mais pois ela é obsoleta por isto que esta vindo sempre nulo se vc clicar na variavel e apertar a tecla control provavelmente deve ter um comentario na linha explicando qual é a variavel que deve ser usada.
Como eu utilizo o Delphi7 isto funciona perfeitamente
GOSTEI 0
Leonardobhbr
07/12/2006
Último comentário engrassado pois na maioria das vezes quando o delphi faz esta referencia mesmo assim a variavel funciona vc esta testando isto em .net ou win32 ?
GOSTEI 0
Brasidata
07/12/2006
@leonardobhbr
Obrigado pela atenção.
Observe:
Isso é parte do que vi na UNIT System quando cliquei na variável + ctrl.
Pelo ´Unsupported´ que vemos ao lado da variável, acho que dá pra ter uma ideia do pq ela nao tá funcionando no Delphi 2006.
Reesta agora descobrir o que devo usar no lugar...
Vou ter que quebrar cabeça no HELP.
:)
Obrigado pela atenção.
Observe:
function AllocMem(Size: Cardinal): Pointer;
var
AllocMemCount: Integer deprecated;
AllocMemSize: Integer deprecated;
{Set this variable to true to report memory leaks on shutdown. This setting
has no effect if this module is sharing a memory manager owned by another
module.}
ReportMemoryLeaksOnShutdown: Boolean;
{$IFDEF MSWINDOWS}
Isso é parte do que vi na UNIT System quando cliquei na variável + ctrl.
Pelo ´Unsupported´ que vemos ao lado da variável, acho que dá pra ter uma ideia do pq ela nao tá funcionando no Delphi 2006.
Reesta agora descobrir o que devo usar no lugar...
Vou ter que quebrar cabeça no HELP.
:)
GOSTEI 0
Massuda
07/12/2006
Não tenho como testar agora, mas o D2006 usa outro gerenciador de memória chamado FastMM. Se for o caso, este código mede a memória em uso alocada pelo FastMM:
uses ... FastMM4, ... // coloque isso num timer ou coisa parecida var Estado: TMemoryManagerState; Blocos: Integer; Bytes: Integer; I: Integer; ... Blocos := 0; Bytes := 0; GetMemoryManagerState(Estado); for I := 0 to High(Estado.SmallBlockTypeStates) do begin Inc(Blocos, Estado.SmallBlockTypeStates[I].AllocatedBlockCount); Inc(Bytes, Estado.SmallBlockTypeStates[I].AllocatedBlockCount * Estado.SmallBlockTypeStates[I].UseableBlockSize); end; Inc(Blocos, Estado.AllocatedMediumBlockCount); Inc(Bytes, Estado.TotalAllocatedMediumBlockSize); Inc(Blocos, Estado.AllocatedLargeBlockCount); Inc(Bytes, Estado.TotalAllocatedLargeBlockSize); // neste ponto, Blocos tem o total de blocos alocados pelo FastMM, // e Bytes é o total de bytes em uso ...
GOSTEI 0
Massuda
07/12/2006
Não tenho como testar agora...
Testei num D2006, funciona OK. ATENÇÃO: Não tem necessidade de incluir FastMM4 no uses, já que no D2006 o FastMM é parte do runtime do Delphi.GOSTEI 0