Jump to content

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

Recommended Posts

  • Membros Pro
Posted

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

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

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

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

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 ?

 

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

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
Posted

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

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

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
Posted

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