-

Para solucionar estes problemas do Tomcat, a solução é revisar a configuração de memória necessária para sua aplicação e aumentar a disponibilidade de memória alocada no Tomcat. Para reconfigurar a memória do Tomcat, é necessário editar os arquivos catalina.bat(Windows) ou catalina.sh(Linux)  ou então utilizar o gerenciador do tomcat (aquele que fica na pasta \bin e geralmente termina em w.exe – exemplo: tomcatw.exe).

Caso você opte por utilizar os arquivos Catalina será necessário adicionar a seguinte configuração:

–JvmMx 1024
Isso define o heap máximo disponível para o Tomcat em 1Gb de memória:

Entendendo HeapSpace:

O Heap Space é uma espécie de Memória dinâmica onde o Java armazena suas variáveis e instâncias de objetos. Este espaço de memória pode aumentar ou diminuir ao longo do tempo, dinamicamente, de acordo com a quantidade de objetos usados no programa.

Quantidade inicial de memória dinâmica: O Xms define a quantidade inicial de memória dinâmica alocada no início da JVM.
Quantidade máxima de memória dinâmica: O parâmetro Xmx define a quantidade máxima de memória dinâmica que a Máquina Virtual Java pode alocar para armazenar esses objetos e variáveis.

O famoso PermGen Space
O PermGen Space é parte da memória chamada de estática ou permanente e é utilizada para carregar suas classes (arquivos .class), internalizar Strings (string pool), entre outras coisas no seu projeto.

Quantidade inicial de memória permanente: O parâmetro XX:MaxPermSize define a quantidade máxima de memória permanente que a JVM pode utilizar
Quantidade máxima de memória permanente: O parâmetro XX:PermSize define o tamanho inicial alocado para sua aplicação.

Exemplo:
-XX:MaxPermSize=512m
Esta configuração (-XX:MaxPermSize=512m) define que memória permanente do tomcat tenha no máximo 512Mb de memória.

Como alterar as configurações de memória do Tomcat nos sistemas operacionais:

No Windows:

Para alterar as configurações de memória do Tomcat é obrigado a usar a ferramenta de linha de comando do tomcat6.

O comando altera as configurações de heap space e permgen:

tomcat6 //US//Tomcat6 –JvmMx 1024 ++JvmOptions=”-XX:MaxPermSize=256m”

Este comando deve ser executado a partir do diretório C:/Program Files/Apache Software Foundation/Tomcat 6.0/bin ou de onde o Tomcat tiver instalado.
Na imagem abaixo, podemos verificar a alteraçã ofeita na execução do comando

configuracaoTomcat

No Linux:

Para alterar as configurações de memória do Tomcat é necessário acessar via SSH a ferramenta de linha de comando do linux.
O seguinte arquivo catalina.sh, se a instalação foi executa com padrão esse arquivo se encontra no seguinte local.

/usr/Java/apache-tomcat-6.0.18/bin/catalina.sh

imagem1
Alterar ou incluir a seguinte linha.

export JAVA_OPTS=”-server -Xms768m -Xmx1024m -XX:MaxPermSize=256m”

imagem2

Após alteração salvar e resetar o Tomcat.

Dica rápida:

Caso esse problema esteja acontecendo dentro de um tomcat interno do Eclipse coloque no Vm Arguments (onde 512, 768 e 256 ficam como opcionais de configuração)

-Xms512M -Xmx768M -XX:PermSize=256M

vm-arguments

Heap space
SEVERE: Servlet.service() for servlet jsp threw exception java.lang.OutOfMemoryError: Java heap space
PermGen
MemoryError: PermGen space java.lang.OutOfMemoryError: PermGen space

10 replies on “Apache Tomcat resolvendo problemas de “OutOfMemoryError e PermGen””

Leave a Comment
  1. Amigo, tem como ajudar quando o problema acontece com OS? Tenho um mac e nao consigo resolver esse problema.

  2. Obrigado pelo post, ajudou muito!

  3. Muito obrigado, me ajudou demais, foi com a sua dica que consegui iniciar o eclipse.

  4. Dellanio,
    bom dia!

    Temos um site em Tomcant 6.0.44, com Grails 1.1 e JDK 7. Recentemente, fizemos a mudança do JDK de 6 p/ 7 e do Tomcat 6.0 p/ esta compilação 6.0.44, em função de nossos deployers “*.war” funcionar apenas com o JDK 7.

    Ao colocar o sistema em produção estamos sempre deparando com o erro de PermGen.

    A aplicação roda em SO Windows. E, ao tentarmos realizar a orientação acima para este SO, percebemos que não escreveu os parâmetro, na última linha do Java Options.

    Como posso validar sua orientação? Há outra alternativa de setar este parâmetro?

    At.,

    José Jr.
    Coordenador de TIC
    Siagri Sistemas

  5. Excelente artigo.
    Muito obrigado, ajudou muito

  6. Vi tanta asneira na internet, de gente falando que o jdbc não libera memória no tomcat, etc. Até cheguei pensar em mudar algumas partes do código que tem jdbc e hibernet jpa. Na verdade a solução e tão simples, basta colocar no header ou footer System.gc(); -> funciona realmente no seu código java. Não adianta colocar null para zerar objetos continua consumindo a memória do mesmo jeito.

  7. Dellanio, te agradeço por compartilhar seu conhecimento. Meu ajudou muito na solução de um problema com seu post.

    Todo sucesso e te acompanharei mais para aprender mais.

  8. Rafael,
    Gostei da dica. Só não entendi uma coisa: cabeçalho (header) e rodapé (footer) de que? ou de onde? Poderia dá um exemplo?

  9. Muito útil suas orientações.
    Parabéns

  10. Muito útil o artigo.
    Parabéns

Leave a Comment

Your email address will not be published.

You may use these HTML tags and attributes: <a href=""> <abbr> <acronym> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Send a Message