
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.
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:
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
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)