Java se niega a iniciar: no se pudo reservar suficiente espacio para el montón de objetos

Fondo

Contamos con un grupo de aproximadamente 20 hojas de linux. Algunos ejecutan Suse, otros ejecutan Redhat. TODOS comparten espacio NAS que contiene las siguientes 3 carpetas:

/ NAS / app / java: un enlace simbólico que apunta a una instalación de un JDK de Java. Actualmente la versión 1.5.0_10/ NAS / app / lib: un enlace simbólico que apunta a una versión de nuestra aplicación./ NAS / data - directorio donde se escribe nuestra salida

Todas nuestras máquinas tienen 2 procesadores (hyperthreaded) con 4gb de memoria física y 4gb de espacio de intercambio. Limitamos el número de 'trabajos' que cada máquina puede procesar en un momento dado a 6 (es probable que este número deba cambiar, pero eso no entra en el problema actual, por lo tanto, ignórelo por el momento).

Algunos de nuestros trabajos establecen un tamaño máximo de almacenamiento de 512 mb, otros reservan un tamaño máximo de 2048 mb. Nuevamente, nos damos cuenta de que podríamos revisar nuestra memoria disponible si se iniciaron 6 trabajos en la misma máquina con el tamaño de almacenamiento dinámico configurado en 2048, pero, por lo que sabemos, esto aún no ha ocurrido.

El problema

De vez en cuando, un trabajo fallará inmediatamente con el siguiente mensaje:

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

Solíamos atribuirlo a demasiados trabajos que se ejecutaban al mismo tiempo en la misma máquina. El problema ocurrió con poca frecuencia (TAL VEZ Una vez al mes) lo reiniciaríamos y todo estaría bien.

El problema ha empeorado recientemente. Todos nuestros trabajos que solicitan un tamaño de pila máximo de 2048 m fallan inmediatamente casi todas las veces y deben reiniciarse varias veces antes de completar.

Hemos salido a máquinas individuales y hemos intentado ejecutarlas manualmente con el mismo resultado.

Depuración

Resulta que el problema solo existe para nuestras cajas SuSE. La razón por la que ha estado ocurriendo con más frecuencia es porque hemos estado agregando más máquinas, y las nuevas son SuSE.

'cat / proc / version' en las cajas SuSE nos da:

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' en las cajas de RedHat nos da:

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 da lo siguiente en AMBOS tipos de máquinas:

UTC 2005 i686 i686 i386 GNU/Linux

No se están ejecutando trabajos en la máquina, y ningún otro proceso está utilizando mucha memoria. Todos los procesos actualmente en ejecuciónpodría estar utilizando 100mb total.

'top' actualmente muestra lo siguiente:

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

'vmstat' actualmente muestra lo siguiente:

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

Si iniciamos un trabajo con la siguiente línea de comando (Max Heap de 1850mb), comienza bien:

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

Si aumentamos el tamaño máximo del montón a 1875 mb, falla:

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.

Es bastante claro que la memoria que se está utilizando actualmente es para almacenamiento en búfer / almacenamiento en caché y por eso se muestra tan poco como 'libre'. Lo que no está claro es por qué hay una línea mágica de 1850 mb en la que cualquier cosa superior significa que Java no puede iniciarse.

Cualquier explicación sería muy apreciada.

Respuestas a la pregunta(15)

Su respuesta a la pregunta