Java lässt sich nicht starten - Es konnte nicht genügend Speicherplatz für den Objektheap reserviert werden
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 wirdAlle 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 ProblemHin 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.
DebuggenEs 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.