Quem sou eu

quinta-feira, 26 de novembro de 2009

java.lang.OutOfMemoryError: Dica para quem tem esse tipo de problema com Java

O Java é uma linguagem de programação muito poderosa, mas desde que me entendo por gente, tem problema de gerenciamento de memória.

Recentemente, realizamos a implantação de uma URA (Unidade de Resposta Audível) que tem um backend para integração com o CTI e com a base de dados do cliente. Toda a integração foi desenvolvida em Java e rodava inicialmente em Tomcat, mas foi migrada para o Jetty com o objetivo de evitar problemas de gerenciamento de memória.

Eis que um belo dia, surge a surpresa. O Jetty simplesmente fechava, depois de um período de produção, com carga. O processo desaparecia e não tinha nada no log mostrando o que houve.

Começamos a monitorar o sistema e recebi a seguinte mensagem no prompt quando o problema aconteceu novamente:

# An unexpected error has been detected by Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 264496 bytes for Chunk::new. Out of swap space?
#
# Internal Error (414C4C4F434154494F4E0E43505000C7), pid=7896, tid=1878612880
#
# Java VM: Java HotSpot(TM) Server VM (1.6.0-b105 mixed mode)
# An error report file with more information is saved as hs_err_pid7896.log
[thread 1406139280 also had an error]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

Pesquisei na Internet e encontrei informações referentes a um possível bug na Java VM. Putz, como eu estava com sorte. Tudo bem. Atualizei para a última JVM, colocamos na produção novamente e o problema apareceu novamente.

Vi em vários sites na Internet orientando para aumentar o heap através do parâmetro -Xmx. Testei, mas não funcionou.

Foi então que descobri que o problema estava relacionado a uma limitação da JVM 32bits de usar no máximo 2GB no heap size. Ou seja, o Jetty começava a alocar os recursos e quando chegava nos 2GB de alocação, gerava esse problema de OutOfMemoryError.

java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?

Essentially the native objects does not have enough memory to use. This is usually because you have allocated too much memory to your heap reducing the amount available for native objects. See this article.

The solution is to reduce the amount of heap memory you have allocated. For example if you have set -Xmx4096, you should consider reducing this to -Xmx2048m.

Remember if you are using a 32bit JVM you cannot allocate more than -Xmx2048m for linux (and even less for windows). Using a 64 bit JVM can resolve this problem, but is not recommended for fisheye/crucible instances (refer to System Requirements).


Solução: Limitar o seu max heap size em 2048.

Para quem precisa fazer tunning em servidores de aplicação Java seguem alguns links úteis:

Nenhum comentário:

Postar um comentário