Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado

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 ?

 

  • Membros Pro
Postado
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

  • Fundadores
Postado

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.

  • Membros Pro
Postado
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...

 

  • Fundadores
Postado

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.

  • Membros Pro
Postado
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..

 

  • Moderadores
Postado

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? 

  • Membros Pro
Postado
10 minutos atrás, Gr@c@ 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

 

  • Membros Pro
Postado

Talvez eu esteja falando besteira, mas seria possível dar um AcbrNFe1.clear no final de cada nota e criar uma função para criar o componente via Código novamente ?

Será que isso não liberaria tudo que o componente fez e/ou carregou na NFCe anterior ?

 

Postado
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

 

 

 

 

 

 

 

 

  • Membros Pro
Postado
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 ?

 

  • Consultores
Postado
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
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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.
  • Consultores
Postado

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
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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.
  • Fundadores
Postado

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.

  • Membros Pro
Postado
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..

 

  • Membros Pro
Postado

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 ?

  • Consultores
Postado
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
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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.
  • Membros Pro
Postado
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 ?
 

  • Fundadores
Postado

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.

  • Membros Pro
Postado

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.

 

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.