programa java sem memória antes de atingir xmx

3

Em um Red Hat 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), nós o iniciamos com esses parâmetros:

 -Xms2048m -Xmx3072m

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

O Linux não nos fornece a RAM de 3 GByte configurada?

Em exatamente a mesma instalação do Windows - o processo java pode usar seu RAM de 3 GB sem qualquer problema.

Capturadeteladojconsolemostrandoousodamemóriaheapapenasentre0,3e1,0GB.NomomentodaexceçãoOutOfMemory,amemóriadoheapestavaem0,5GB,masoprocessoteria3GBparafuncionar,masnão...

EDIT:logadicionadodoprocessojava:

java.lang.OutOfMemoryError:unabletocreatenewnativethread

EDIT2:adicionadosaídalivre-m:

    
por Darkpara 25.11.2014 / 14:55

3 respostas

2

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. Eu tive que aumentar o limite para o meu usuário, agora tudo funciona bem.

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

myuser             soft    nproc           8192
myuser             hard    nproc           8192

    
por 26.11.2014 / 17:25
1

O Java possui várias gerações de espaço de heap, geração permanente nova e antiga.

Se você definir Xmx muito alto, isso é usado para heap e, mesmo que não use heap inteiro, pode ficar sem memória. Isso geralmente acontece se você ficar sem espaço no PermGen.

A geração permanente de heap é usada para armazenar conjunto de Sequências e vários Metadados exigidos pela JVM relacionados a Classe, método e outras primitivas Java. Perm space é geralmente 64MB, então se você tem muitas classes ou strings enormes, você pode ficar sem isso.

Tente aumentar o tamanho do permgen adicionando:

-XX:MaxPermSize=256m

para suas opções de inicialização do java.

    
por 25.11.2014 / 15:06
0

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

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

    
por 25.11.2014 / 20:15