programa java sem memória antes de chegar ao xmx

programa java sem memória antes de chegar ao xmx

Em um Redhat CentOS 6.4 há apenas alguns processos em execução, usando cerca de 3 GB de RAM (o sistema tem 12 GB disponíveis). Um dos processos é um Servidor WSO2ESB (java), iniciamos com estes parâmetros:

 -Xms2048m -Xmx3072m

Depois de um tempo, obtemos uma exceção OutOfMemory, maso processo java (WSO2ESB) nem está usando seus 3 GB. No jconsole você também pode ver que esses parâmetros foram definidos corretamente (o servidor Linux tem cerca de 9 GB de RAM livre neste momento)

O Linux não nos fornece os 3 GByte de RAM configurados?

Exatamente na mesma instalação do Windows - o processo java pode usar 3 GB de RAM sem nenhum problema.

insira a descrição da imagem aqui Captura de tela do jconsole mostrando o uso de memória heap apenas entre 0,3 e 1,0 GB. No momento da exceção OutOfMemory, a memória Heap estava em 0,5 GB, mas o processo teria 3 GB para trabalhar, mas isso não acontece...

EDIT: adicionado log do processo java:

java.lang.OutOfMemoryError: unable to create new native thread

EDIT2: adicionada saída free -m: insira a descrição da imagem aqui

Responder1

Eu resolvi o problema. wso2esb estava usando mais de 1000 Threads. Mas no Linux a quantidade padrão de Threads que um usuário pode usar é definida como 1024. Tive que aumentar o limite do meu usuário, agora tudo funciona bem.

Para fazer isso: abra /etc/security/limits.conf e adicione as duas linhas a seguir para o seu usuário:

myuser             soft    nproc           8192
myuser             hard    nproc           8192

insira a descrição da imagem aqui

Responder2

Java tem múltiplas gerações de espaço de heap, novas e antigas gerações permanentes.

Se você definir um Xmx muito alto, isso será usado para heap, e mesmo se você não usar o heap inteiro, poderá ficar sem memória. Isso geralmente acontece se você ficar sem espaço no PermGen.

A geração permanente de heap é usada para armazenar o pool de String e vários metadados exigidos pela JVM relacionados à classe, método e outras primitivas Java. O espaço permanente é geralmente de 64 MB, portanto, se você tiver muitas classes ou strings enormes, poderá ficar sem espaço.

Tente aumentar o tamanho do permgen adicionando:

-XX:MaxPermSize=256m

às suas opções de inicialização do Java.

Responder3

qual é o tamanho do segmento de dados para o heap -Xms2048m -Xmx3072m.

o tamanho do segmento de dados deve corresponder ao tamanho máximo de heap (que é 3.072 m neste caso). Portanto, o tamanho do seu segmento de dados deve ser definido como pelo menos 3221225472(em bytes 3*1024*1024*1024 = 3GB)

informação relacionada