Java se recusa a iniciar - não foi possível reservar espaço suficiente para heap de objeto

fundo

Nós temos um pool de aproximadamente 20 lâminas de linux. Alguns estão rodando o Suse, outros rodando o Redhat. TODOS compartilham o espaço NAS que contém as seguintes 3 pastas:

/ NAS / app / java - um link simbólico que aponta para uma instalação de um Java JDK. Atualmente versão 1.5.0_10/ NAS / app / lib - um link simbólico que aponta para uma versão do nosso aplicativo./ NAS / data - diretório onde nossa saída é escrita

Todas as nossas máquinas possuem 2 processadores (hyperthreaded) com 4gb de memória física e 4gb de espaço de swap. Limitamos o número de 'jobs' que cada máquina pode processar em um determinado momento para 6 (esse número provavelmente precisará ser alterado, mas isso não entra no problema atual, portanto, ignore-o por enquanto).

Alguns de nossos trabalhos definem um tamanho máximo de 512mb, outros reservam um tamanho máximo de 2048mb. Novamente, percebemos que poderíamos examinar nossa memória disponível se 6 tarefas começassem na mesma máquina com o tamanho de heap configurado para 2048, mas, até onde sabemos, isso ainda não ocorreu.

O problema

De vez em quando um trabalho irá falhar imediatamente com a seguinte mensagem:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Nós costumávamos fazer isso com muitos trabalhos rodando ao mesmo tempo na mesma máquina. O problema aconteceu com pouca frequência (TALVEZ uma vez por mês) que nós apenas o reiniciaríamos e tudo ficaria bem.

O problema recentemente ficou muito pior. Todas as nossas tarefas que solicitam um tamanho de heap máximo de 2048m falham imediatamente quase todas as vezes e precisam ser reiniciadas várias vezes antes de serem concluídas.

Nós saímos para máquinas individuais e tentamos executá-las manualmente com o mesmo resultado.

Depuração

Acontece que o problema só existe para as nossas caixas SuSE. A razão pela qual tem acontecido com mais frequência é porque temos adicionado mais máquinas, e as novas são SuSE.

'cat / proc / version' nas caixas SuSE nos fornece:

Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005

'cat / proc / version' nas caixas RedHat nos fornece:

Linux version 2.4.21-32.0.1.ELsmp ([email protected]) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-52)) #1 SMP Tue May 17 17:52:23 EDT 2005

'uname -a' nos dá o seguinte em ambos os tipos de máquinas:

UTC 2005 i686 i686 i386 GNU/Linux

Nenhum trabalho está sendo executado na máquina e nenhum outro processo está utilizando muita memória. Todos os processos atualmente em execuçãopoderia estar usando 100mb total.

'top' atualmente mostra o seguinte:

Mem:   4146528k total,  3536360k used,   610168k free,   132136k buffers
Swap:  4194288k total,        0k used,  4194288k free,  3283908k cached

'vmstat' atualmente mostra o seguinte:

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
0  0      0 610292 132136 3283908    0    0     0     2   26    15  0  0 100  0

Se iniciarmos um trabalho com a seguinte linha de comando (Max Heap de 1850mb), ele iniciará bem:

java/bin/java -Xmx1850M -cp helloworld.jar HelloWorld
Hello World

Se aumentarmos o tamanho máximo do heap para 1875MB, ele falhará:

java/bin/java -Xmx1875M -cp helloworld.jar HelloWorld
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Está claro que a memória atualmente sendo usada é para Buffering / Caching e é por isso que tão pouco está sendo exibido como 'livre'. O que não está claro é por que existe uma linha mágica de 1850mb, onde qualquer coisa mais alta significa que o Java não pode ser iniciado.

Quaisquer explicações seriam muito apreciadas.

questionAnswers(15)

yourAnswerToTheQuestion