Fórum Medir memória em uso pelo programa #334370

07/12/2006

0

[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

Leonardobhbr

Responder

Posts

07/12/2006

Brasidata

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


Responder

Gostei + 0

07/12/2006

Leonardobhbr

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


Responder

Gostei + 0

07/12/2006

Massuda

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.


Responder

Gostei + 0

07/12/2006

Leonardobhbr

@Massuda


Boa lembrança do ´AllocMemSize´


Responder

Gostei + 0

07/12/2006

Brasidata

@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) :

[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


Responder

Gostei + 0

07/12/2006

Leonardobhbr

@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


Responder

Gostei + 0

07/12/2006

Leonardobhbr

Ú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 ?


Responder

Gostei + 0

07/12/2006

Brasidata

@leonardobhbr

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.


:)


Responder

Gostei + 0

07/12/2006

Massuda

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



Responder

Gostei + 0

07/12/2006

Massuda

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar