Java heap space



  • Bom dia a todos.
    Estou tendo problemas em uma rotina de processamento batch. Essa rotina fica verificando a existências de arquivos ZIP em um determinado diretório. Gera uma lista com estes arquivos. Lê toda a lista descompactando o arquivo em um diretório temporário. Após descompactar um arquivo ele processa os registros internos. O processamento destes registro é a conversão de PNG para PDF. Após converter o primeiro ele segue para o próximo. Depois de processar todos os registros do primeiro arquivo ZIP, ele segue para o próximo e fica realizando este ciclo até processar toda a lista.

    Estou me deparando frequentemente com a interrupção da rotina por Java heap space.

    Exception in thread "Thread-932" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2786)
    at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:133)
    at com.itextpdf.text.pdf.codec.PngImage.getImage(PngImage.java:573)
    at com.itextpdf.text.pdf.codec.PngImage.getImage(PngImage.java:230)
    at com.itextpdf.text.pdf.codec.PngImage.getImage(PngImage.java:212)
    at com.itextpdf.text.Image.getInstance(Image.java:268)
    at com.itextpdf.text.Image.getInstance(Image.java:335)
    at wfr.com.systems.system_efd.rules.WebrunFunctions.ebfConvertePNGPDFA4(WebrunFunctions.java:1388)
    at wfr.com.systems.system_efd.rules.AtualizaCtrcComRecebimentoDaImagem.FlowExpression13(AtualizaCtrcComRecebimentoDaImagem.java:713)
    at wfr.com.systems.system_efd.rules.AtualizaCtrcComRecebimentoDaImagem.FlowExpression24(AtualizaCtrcComRecebimentoDaImagem.java:754)
    at wfr.com.systems.system_efd.rules.AtualizaCtrcComRecebimentoDaImagem.FlowExpression60(AtualizaCtrcComRecebimentoDaImagem.java:826)
    at wfr.com.systems.system_efd.rules.AtualizaCtrcComRecebimentoDaImagem.FlowDecision6(AtualizaCtrcComRecebimentoDaImagem.java:612)
    at wfr.com.systems.system_efd.rules.AtualizaCtrcComRecebimentoDaImagem.FlowExpression68(AtualizaCtrcComRecebimentoDaImagem.java:1032)
    at wfr.com.systems.system_efd.rules.AtualizaCtrcComRecebimentoDaImagem.FlowExpression33(AtualizaCtrcComRecebimentoDaImagem.java:377)
    at wfr.com.systems.system_efd.rules.AtualizaCtrcComRecebimentoDaImagem.run(AtualizaCtrcComRecebimentoDaImagem.java:201)
    at wfr.rules.WFRRule.start(WFRRule.java:755)
    at wfr.rules.WFRRule.callRule(WFRRule.java:675)
    at wfr.com.systems.system_efd.rules.VerificaArquivoDeImagem.FlowExpression26(VerificaArquivoDeImagem.java:488)
    at wfr.com.systems.system_efd.rules.VerificaArquivoDeImagem.FlowExpression10(VerificaArquivoDeImagem.java:448)
    at wfr.com.systems.system_efd.rules.VerificaArquivoDeImagem.FlowExpression57(VerificaArquivoDeImagem.java:605)
    at wfr.com.systems.system_efd.rules.VerificaArquivoDeImagem.run(VerificaArquivoDeImagem.java:332)
    at wfr.rules.WFRRule.start(WFRRule.java:755)
    at wfr.rules.WFRRule.start(WFRRule.java:769)
    at wfr.com.systems.system_efd.rules.WebrunFunctions$1RuleExecutionThread.run(WebrunFunctions.java:9906)
    Exception in thread "Timer-1" java.lang.OutOfMemoryError: Java heap space
    Exception in thread "Thread-931" java.lang.OutOfMemoryError: Java heap space
    Exception in thread "Thread-537" java.lang.OutOfMemoryError: Java heap space
    - [waffle.servlet.NegotiateSecurityFilter] stopped

    Alguém pode ajudar ou já teve uma situação parecida? Teria como eu limpar esta pilha no Maker?

    Obrigado a todos.


  • Este erro é de falta de memória.
    Ou você otimiza seu processo ou aumenta a memória do tomcat.


  • Saeger, bom dia.

    Já aumentei a memória do Tomcat no máximo permitido. A otimização que você fala é quebrar o fluxo em sub-fluxos? Diminuir as interações? Esse Fluxo é bem grande.
    Outro ponto é que são três processos rodando em paralelo. São independentes mais compartilham a mesma memória, correto? Não tenho no Maker como liberar a memória ao fim de uma interação?

    Att, Juliano Roque


  • O problema não é o maker. é o seu fluxo. Ele está consumindo muita memória. Quem tem que liberar memória é você, não o Webrun. O Java ja faz o melhor possível, através do garbage collector.

    Não existe limite de memória máxima. Se você precisa de mais memória, coloque uma JDK de 64 bits. Dai seu limite de memória será de 256TB.


  • Não estou atribuindo ao Maker o problema. Estou querendo saber se existe, no Maker, uma maneira de forçar a limpeza da memória. Essa rotina fica sendo executada a cada 30 minutos e 24 horas por dia. Ela é bem grande com muitos processos e utiliza classes de terceiros (itext). O que gostaria de saber é se existe como no Maker limpar memória? Ela converte arquivo de PNG para PDF e também adiciona página no PDF, isso pode consumir muita memória?
    valeu


  • Você pode utilizar o Maker Profiler e executar o fluxo para ver em quais processamentos está demorando mais tempo, por exemplo.

    Talvez com isso você consiga melhorar alguma coisa.

    Não existe função para "limpar memória".


  • Juliano, para liberar a memória, você pode quebrar seu processo em threads.. crie uma lógica, utilizando variáveis locais ou da sessão e agende execução de fluxo.. A cada fluxo agendado, a memória do processo é liberada e se inicia uma nova thread. Fazendo isso, você não terá esse problema.


  • Obrigado Anderson.


  • Pessoal,
    estou passando por esse problema tambem, porem no maker 3.6

    como faco pra colocar o jdk 64bits?

    existe um webrun 64bits?

Log in to reply