Jump to content

click.png click.png click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

ACBR x Alocação de memória


  • Este tópico foi criado há 1771 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Bom dia

Estou enfrentando um problema ultimamente e gostaria de saber uma opinião sobre isso..

Depois de debugar o programa acompanhando o uso de memória no gerenciador de tarefas no windows, verifiquei que a quantidade de memória alocada no momento em que é feito o envio da NFCe (ACBRNFe1.Enviar) sobe muito e além disso fica cada vez maior conforme os documentos são enviados na seqência.

Ex: Envio uma NFCe de 120 ítens.. Antes de enviar a memória alocada era de 6MB. Quando executou o envio, subiu para 38 MB. Depois Fiz a mesma nfce com os mesmos 120 ítens. Antes de enviar 6MB, No envio, 42 MB. Em uma terceiria tentativa, foi para 56 MB, e assim vai subindo até que uma hora ocorre "out of memory" no sistema.

Uso o componente do ACBR em outro formulário e faço a liberação do mesmo após cada envio. 

Será que existe algo que se possa fazer para controlar isso ?

 

Link to comment
Share on other sites

  • Moderadores

Pq vc faz a liberação a cada envio? Deixe o componente em um datamodule e sempre use o mesmo para todas as funções relacionadas com os webservices.

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link to comment
Share on other sites

  • Membros Pro
2 minutos atrás, André Ferreira de Moraes disse:

Pq vc faz a liberação a cada envio? Deixe o componente em um datamodule e sempre use o mesmo para todas as funções relacionadas com os webservices.

Vou tentar colocar num DataModule. Vamos ver se da alguma diferença

Obrigado pela dica

Link to comment
Share on other sites

  • Fundadores

Existem programas que pegam "MemoryLeaks"... no Lazarus usamos a compilação com "HeapTrace"...

Não estou bem certo de qual seria o programa no Delphi, mas certamente deve existir...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Membros Pro
5 minutos atrás, Daniel Simoes disse:

Existem programas que pegam "MemoryLeaks"... no Lazarus usamos a compilação com "HeapTrace"...

Não estou bem certo de qual seria o programa no Delphi, mas certamente deve existir...

Olá.

Eu uso uma função que achei em outro fórum chamada TrimAppMemory que diminui bastante a quantidade de memória. 

Não sei se se trata disso...

 

Link to comment
Share on other sites

  • Fundadores

Não exatamente... a ideia é achar objetos que não foram destruídos...

no Google achei esse link:http://www.devmedia.com.br/detectando-memory-leaks-em-delphi-win32-com-cnmemprof-e-fastmm4/11146

Talvez o @EMBarbosa, possa nos dar informações mais precisas...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Membros Pro
2 horas atrás, André Ferreira de Moraes disse:

Pq vc faz a liberação a cada envio? Deixe o componente em um datamodule e sempre use o mesmo para todas as funções relacionadas com os webservices.

Passei a usar o componente em um DataModule, mas o comportamento ainda é o mesmo !

Fica alocando cada vez mais memória no Envio..

 

Link to comment
Share on other sites

  • Moderadores

Eu uso o ACBr em meu form principal e não tenho esse problema. Dentro do seu processo de envio de cada nota, tem criação de tabelas temporárias, criação de objetos, ou querys abertas e não fechadas, ou algum outro processo que devesse ser finalizado/destruido antes do envio da proxima nota? Nesse processo de envio, há chamada a procedures ou triggers do BD? Fez um profiler do banco de dados para rastrear o que acontece no BD durante o envio das notas? 

Link to comment
Share on other sites

  • Membros Pro
10 minutos atrás, [email protected]@ disse:

Eu uso o ACBr em meu form principal e não tenho esse problema. Dentro do seu processo de envio de cada nota, tem criação de tabelas temporárias, criação de objetos, ou querys abertas e não fechadas, ou algum outro processo que devesse ser finalizado/destruido antes do envio da proxima nota? Nesse processo de envio, há chamada a procedures ou triggers do BD? Fez um profiler do banco de dados para rastrear o que acontece no BD durante o envio das notas? 

Não tenho criação de tabelas temporárias nem criação de objetos. No final de cada nota, todas as querys são fechadas, inclusive é desconectado do banco de dados e conectado novamente. Não tenho nenhuma Triggers no BD.

 

1 hora atrás, André Ferreira de Moraes disse:

Vc consegue simular o problema usando o demo?

Vou ter que altera o Demo para mandar mais ítens por nota, mas posso tentar

 

Acabei de testar aqui com o demo e ocorre a mesma coisa..

Enviei com um ítem mesmo, sem alterar nada no Demo..

Enviei 3 NFCes.

A primeira - 5,3 MB

A segunda 13,3 MB

A terceira 17,3 MB

 

Link to comment
Share on other sites

6 horas atrás, Dércio Luis Zanatta disse:

Passei a usar o componente em um DataModule, mas o comportamento ainda é o mesmo !

Fica alocando cada vez mais memória no Envio..

 

Ola Dercio, se voce usa o Delphi Xe para cima , basta voce colocar no seu project as seguintes linhas

 

{$IFDEF DEBUG}
  ReportMemoryLeaksOnShutdown := True;
  {$ENDIF}

As diretivas são apenas se estiver em Debug. 

No Delphi 7 tem o FastMM4

 

Abraço

 

 

 

 

 

 

 

 

Link to comment
Share on other sites

  • Consultores

Boa tarde!

primeiro informe a versão do delphi!

como está liberando a compilação em debug ou release para o seu cliente?

consegue repetir o mesmo com o demo do acbr?

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
http://www.juliomarmarchetti.com.br
Embarcadero MVP
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil
Link to comment
Share on other sites

  • Membros Pro
1 hora atrás, Juliomar Marchetti disse:

Boa tarde!

primeiro informe a versão do delphi!

como está liberando a compilação em debug ou release para o seu cliente?

consegue repetir o mesmo com o demo do acbr?

Uso Delhphi 7.

No Acbr, a cada NFCe que envia, também cresce a memória..

1 hora atrás, Antonio Carlos L disse:

Ola Dercio, se voce usa o Delphi Xe para cima , basta voce colocar no seu project as seguintes linhas

 

{$IFDEF DEBUG}
  ReportMemoryLeaksOnShutdown := True;
  {$ENDIF}

As diretivas são apenas se estiver em Debug. 

No Delphi 7 tem o FastMM4

 

Abraço

 

 

 

 

 

 

 

 

Ola. 

Eu uso Delphi 7.

Estive lendo algo sobre esse FastMM. Não sei se entendi direito, mas ele tem a função de informar o que está carregado não de liberar. Certo ?

 

Link to comment
Share on other sites

  • Consultores
Em 27/10/2016 at 11:25, Daniel Simoes disse:

Talvez o @EMBarbosa, possa nos dar informações mais precisas...

É exatamente isso que precisamos Daniel. Nesse momento estou analisando o log postado.

 

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • Consultores

No log, são objetos do Fortes Report que estão "vazando".

Não estou familiarizado com o código do Fortes Report, então o que vou escrever é uma possibilidade.

Parece que um objeto  TRLPreviewForm é alocado cada vez que um preview é mostrado. Mas não está sendo destruído.

Para encurtar a história... chegamos no método abaixo PreviewPagesWithOptions da unit RLPreviewForm:

procedure PreviewPagesWithOptions(APages: TRLGraphicStorage; AShowModal: Boolean; AFormStyle: TFormStyle; APosition: TPosition; AWindowState: TWindowState; ABorderIcons: TBorderIcons; const AHelpFile: string; AHelpContext: Integer; ACaption: TCaption);
begin
  SentToPrinter := False;
  with TRLPreviewForm.Create(nil) do
  begin
    Preview.Pages := APages;
    if DefaultZoomFactor = ZoomFactorFullWidth then
      Preview.ZoomFullWidth
    else if DefaultZoomFactor = ZoomFactorFullPage then
      Preview.ZoomFullPage
    else if DefaultZoomFactor = ZoomFactorMultiplePages then
      Preview.ZoomMultiplePages
    else if DefaultZoomFactor > 0 then
      Preview.ZoomFactor := DefaultZoomFactor;
    UpdateComboBoxZoom;
    Position := APosition;
    WindowState := AWindowState;
    BorderIcons := ABorderIcons;
    HelpFile := AHelpFile;
    HelpContext := AHelpContext;
    if ACaption <> '' then
      Caption := ACaption;
    FormStyle := AFormStyle;
    if AShowModal then
      ShowModal
    else if Visible then
      BringToFront
    else
      Show;
  end;
end;

Como podem ver. É criado um objeto TRLPreviewForm logo no começo (junto com o with). É passado como owner para ele 'nil', o que significa que temos que destruí-lo manualmente.

Mas parece que esse objeto não é destruído em nenhum lugar...

Talvez resolvesse boa parte do problema se o código fosse alterado para: (note o try..Finally Free;)

procedure PreviewPagesWithOptions(APages: TRLGraphicStorage; AShowModal: Boolean; AFormStyle: TFormStyle; APosition: TPosition; AWindowState: TWindowState; ABorderIcons: TBorderIcons; const AHelpFile: string; AHelpContext: Integer; ACaption: TCaption);
begin
  SentToPrinter := False;
  with TRLPreviewForm.Create(nil) do
  begin
    try
      Preview.Pages := APages;
      if DefaultZoomFactor = ZoomFactorFullWidth then
        Preview.ZoomFullWidth
      else if DefaultZoomFactor = ZoomFactorFullPage then
        Preview.ZoomFullPage
      else if DefaultZoomFactor = ZoomFactorMultiplePages then
        Preview.ZoomMultiplePages
      else if DefaultZoomFactor > 0 then
        Preview.ZoomFactor := DefaultZoomFactor;
      UpdateComboBoxZoom;
      Position := APosition;
      WindowState := AWindowState;
      BorderIcons := ABorderIcons;
      HelpFile := AHelpFile;
      HelpContext := AHelpContext;
      if ACaption <> '' then
        Caption := ACaption;
      FormStyle := AFormStyle;
      if AShowModal then
        ShowModal
      else if Visible then
        BringToFront
      else
        Show;
    finally
      Free;
    end;
  end;
end;

 

 

 

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • Fundadores

Pode ser algo no Demo em Delphi ou no FortesReport em Delphi... não parece ser no componente ACBrNFe

Fiz o teste com o ACBr_NFeDemo, compilado em Lazarus e com o HeapTrace ligado...

Cliquei em "Criar e Enviar", e após a recepção, o Preview do DANFE foi exibido...

Não houve vazamento de memória... Segue o HeapTrace

C:\Pascal\Comp\ACBr\trunk2\Exemplos\ACBrDFe\ACBrNFe\Lazarus\ACBrNFE_Demo.exe > c:\temp\stdout.txt 2> c:\temp\stderr.txt 
Heap dump by heaptrc unit
367286 memory blocks allocated : 38285816/39324456
367286 memory blocks freed     : 38285816/39324456
0 unfreed memory blocks : 0
True heap size : 2195456
True free heap : 2195216
Should be : 2195456

 

 

Elton,

Esse formulário, libera a si próprio da memória...

procedure TRLPreviewForm.DoClose(var Action: TCloseAction);
begin
  DefaultWindowState := WindowState;
  DefaultWindowBounds := BoundsRect;
  //
  Action := caFree;
end;  

(a não ser que TForm no Delphi XE , não chame por "DoClose")

 

@Dércio Luis Zanatta, favor compilar em Modo Debug, e deixar um Break Point no método acima...  (RLPreviewForm.pas:1233)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Fundadores

@Dércio Luis Zanatta,

Notei um assincronismo das linhas do seu HeapTrace e os fontes do Fortes Report atual... 

Verifique se os seus fontes do Fortes Report estão atualizados...

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Membros Pro
6 minutos atrás, EMBarbosa disse:

Postamos praticamente juntos e parece realmente não é no ACBrNFe, mas no Fortes...

Estou tentando gerar esse log no meu aplicativo , em Delphi 7, porém não estou conseguindo...

Inclui o FastMM4 no uses, fiz as configurações no arquivo .INC, setei as variáveis, faz tudo... só não cria o log !

Vou continuar tentando.. Se conseguir, posto aqui..

 

6 minutos atrás, EMBarbosa disse:

Postamos praticamente juntos e parece realmente não é no ACBrNFe, mas no Fortes...

Estou tentando gerar esse log no meu aplicativo , em Delphi 7, porém não estou conseguindo...

Inclui o FastMM4 no uses, fiz as configurações no arquivo .INC, setei as variáveis, faz tudo... só não cria o log !

Vou continuar tentando.. Se conseguir, posto aqui..

 

Link to comment
Share on other sites

  • Membros Pro

Alguém sabe se esse FAstMM4 funciona no Delphi 7 ?

Aqui pra mim funciona no delphi 2010, porém não funciona no 7 , não cria o log !

 

 

45 minutos atrás, Daniel Simoes disse:

@Dércio Luis Zanatta,

Notei um assincronismo das linhas do seu HeapTrace e os fontes do Fortes Report atual... 

Verifique se os seus fontes do Fortes Report estão atualizados...

 

Uma perguntinha...

Atualmente eu somente uso o Fortes para gerar a DANFE em PDF no envio por e-mail.

Se eu não usar o método ACBRNFe1.ImprimrPDF, esse métodos serão carregados mesmo assim ?

Somente o fato de estar compilado o componente do ACBR que usa o Fortes já causaria o problema ?

Link to comment
Share on other sites

  • Consultores
24 minutos atrás, Dércio Luis Zanatta disse:

Alguém sabe se esse FAstMM4 funciona no Delphi 7 ?

Aqui pra mim funciona no delphi 2010, porém não funciona no 7 , não cria o log !

Funciona no Delphi 7. Inclusive, se você usa o Delphi 7 e não usa o FastMM deveria começar a usar logo.

Talvez esteja faltando você alterar as opções do projeto para gerar o arquivo. Está gerando o projeto em modo debug? Fez um "Build" após alterar as opções?

27 minutos atrás, Dércio Luis Zanatta disse:

Se eu não usar o método ACBRNFe1.ImprimrPDF, esse métodos serão carregados mesmo assim ?

Somente o fato de estar compilado o componente do ACBR que usa o Fortes já causaria o problema ?

Teoricamente, não... Mas veja que ainda não conseguimos reproduzir seu problema... Precisamos diagnosticar exatamente onde ele ocorre.

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • Membros Pro
2 minutos atrás, EMBarbosa disse:

Funciona no Delphi 7. Inclusive, se você usa o Delphi 7 e não usa o FastMM deveria começar a usar logo.

Talvez esteja faltando você alterar as opções do projeto para gerar o arquivo. Está gerando o projeto em modo debug? Fez um "Build" após alterar as opções?

Fiz o seguinte...

1 - Alterei o arquivo FastMM4Options.INC as seguintes linhas:

{.$define FullDebugMode}  para {$define FullDebugMode}

e

{.$define ClearLogFileOnStartup} para {$define ClearLogFileOnStartup}

 

2 - No meu .DPR, inclui o FastMM4 no Uses como primeira Unit.

e

setei as variáveis antes do Application.Initialize;

  FullDebugModeScanMemoryPoolBeforeEveryOperation := True;
  SuppressMessageBoxes:=False;

Rodo a aplicação em modo Debug !!

 

Faltou alguma coisa ?
 

Link to comment
Share on other sites

  • Fundadores

Por favor primeiro pela atualização do Fortes Report

https://github.com/fortesinformatica/fortesreport-ce

Qual é exatamente o passo a passo (quais botões clicar, e em qual ordem) que você está fazendo, com o ACBrNFe_Demo ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Membros Pro

Eurecaaaaa

Meu aplicativo não está gerando Log do FASTMM pois não gera nenhum Memory Leak.

Fiz um teste agora, forçando um memory leak. Criei um String list e não liberei. Dessa forma gerou log.

A notícia boa é que não tem memory Leak no meu aplicativo.

A notícia ruim é que mesmo assim a memória alocada Fica Crescendo conforme utiliza o mesmo.

Por enquanto, muito obrigado pela ajuda de todos.

Se alguém tiver mais alguma sugestão do que pode ser feito para resolver isso, fico agradecido.

 

Link to comment
Share on other sites

  • Este tópico foi criado há 1771 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.