Java lässt sich nicht starten - Es konnte nicht genügend Speicherplatz für den Objektheap reserviert werden

Hintergrund

Wir haben einen Pool von ca. 20 Linux Blades. Einige führen Suse aus, andere Redhat. ALL teilen sich den NAS-Speicherplatz, der die folgenden 3 Ordner enthält:

/ NAS / app / java - Ein Symlink, der auf eine Installation eines Java-JDK verweist. Derzeit Version 1.5.0_10/ NAS / app / lib - Ein Symlink, der auf eine Version unserer Anwendung verweist./ NAS / data - Verzeichnis, in das unsere Ausgabe geschrieben wird

Alle unsere Computer verfügen über 2 Prozessoren (Hyperthreading) mit 4 GB physischem Speicher und 4 GB Swap-Speicher. Wir begrenzen die Anzahl der 'Jobs', die jede Maschine zu einem bestimmten Zeitpunkt verarbeiten kann, auf 6 (diese Anzahl muss wahrscheinlich geändert werden, aber das ist noch nicht das aktuelle Problem. Ignorieren Sie sie daher vorerst).

Einige unserer Jobs haben eine maximale Heap-Größe von 512 MB, andere eine maximale Heap-Größe von 2048 MB. Wiederum stellen wir fest, dass wir unseren verfügbaren Speicherplatz überschreiten könnten, wenn 6 Jobs auf demselben Computer mit der Heap-Größe 2048 gestartet würden, aber unseres Wissens ist dies noch nicht geschehen.

Das Problem

Hin und wieder schlägt ein Job mit der folgenden Meldung sofort fehl:

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

Früher haben wir zu viele Jobs gleichzeitig auf demselben Computer ausgeführt. Das Problem ist selten genug aufgetreten (KÖNNTE SEIN einmal im Monat), dass wir es einfach neu starten und alles in Ordnung wäre.

Das Problem ist in letzter Zeit viel schlimmer geworden. Alle unsere Jobs, die eine maximale Heap-Größe von 2048 m erfordern, schlagen fast jedes Mal sofort fehl und müssen vor dem Abschluss mehrmals neu gestartet werden.

Wir sind zu einzelnen Maschinen gegangen und haben versucht, sie manuell auszuführen, mit demselben Ergebnis.

Debuggen

Es stellt sich heraus, dass das Problem nur für unsere SuSE-Boxen besteht. Der Grund dafür ist, dass wir mehr Maschinen hinzugefügt haben und die neuen sind SuSE.

'cat / proc / version' auf den SuSE-Boxen gibt uns:

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' auf den RedHat-Boxen geben uns:

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' gibt uns Folgendes für BEIDE Maschinentypen:

UTC 2005 i686 i686 i386 GNU/Linux

Auf dem Computer werden keine Jobs ausgeführt, und keine anderen Prozesse belegen viel Arbeitsspeicher. Alle derzeit ausgeführten Prozessekönnte Verwenden Sie insgesamt 100 MB.

'top' zeigt derzeit Folgendes:

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

'vmstat' zeigt derzeit Folgendes an:

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

Wenn wir einen Job mit der folgenden Befehlszeile starten (Max. Heap von 1850 MB), fängt er gut an:

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

Wenn wir die maximale Heap-Größe auf 1875 MB erhöhen, schlägt dies fehl:

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 ist ziemlich klar, dass der aktuell verwendete Speicher für das Puffern / Zwischenspeichern vorgesehen ist, und deshalb wird so wenig als "frei" angezeigt. Was nicht klar ist, warum es eine magische 1850-MB-Linie gibt, bei der etwas Höheres bedeutet, dass Java nicht starten kann.

Für Erklärungen wäre ich sehr dankbar.

Antworten auf die Frage(15)

Ihre Antwort auf die Frage