Es konnte nicht genügend Platz für den Objekthaufen reserviert werden

1. Übersicht

In diesem Tutorial lernen wir die Ursache des Fehlers "Nicht genügend Speicherplatz für Objekthaufen reservieren" kennen , während wir einige mögliche Szenarien durchgehen.

2. Symptome

"Es konnte nicht genügend Speicherplatz für den Objektheap reserviert werden" ist ein spezifischer JVM-Fehler, der ausgelöst wird, wenn der Java-Prozess die virtuelle Maschine aufgrund von Speicherbeschränkungen auf dem laufenden System nicht erstellen kann:

java -Xms4G -Xmx4G -jar HelloWorld.jar Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.

Im Allgemeinen gibt es zwei mögliche Szenarien, wenn der Fehler auftritt.

Erstens, wenn wir das Mittagessen ein Java - Prozess mit max Heap - Größe Grenz - Parametern ( -Xmx ) und dem Wert ist mehr als das, was der Prozess auf dem Betriebssystem haben kann .

Die Beschränkung der Heap-Größe hängt von mehreren Einschränkungen ab:

  • Hardwarearchitektur (32/64 Bit)
  • JVM-Bit-Version (32/64 Bit)
  • das Betriebssystem, das wir verwenden

Zweitens, wenn der Java-Prozess aufgrund anderer Anwendungen, die auf demselben System ausgeführt werden und Speicher belegen, nicht in der Lage ist, die angegebene Speichermenge zu reservieren .

3. Heap-Größe

Java- Heapspeicher ist der Speicherzuweisungspool für das Java-Laufzeitprogramm, der von der JVM selbst verwaltet wird. Standardmäßig ist der Zuordnungspool auf die anfängliche und maximale Größe beschränkt. Weitere Informationen zu Heap Space in Java finden Sie in diesem Artikel hier.

Mal sehen, wie groß der maximale Heap in verschiedenen Umgebungen ist und wie wir die Grenzwerte festlegen können.

3.1. Maximale Heap-Größe

Das maximale theoretische Heap-Limit für die 32-Bit- und 64-Bit-JVM lässt sich leicht anhand des verfügbaren Speicherplatzes ermitteln: 2 ^ 32 (4 GB) für 32-Bit-JVM und 2 ^ 64 (16 Exabyte) für 64- Bit JVM.

In der Praxis kann der Grenzwert aufgrund verschiedener Einschränkungen viel niedriger sein und variiert je nach Betriebssystem. Beispielsweise auf 32-Bit - Windows - Systeme die maximale heap Grßenbereich zwischen 1,4 GB auf 1,6 GB . Im Gegensatz dazu kann auf 32-Bit-Linux-Systemen die maximale Heap-Größe bis zu 3 GB betragen.

Wenn die Anwendung einen großen Heap benötigt, sollten wir aus diesem Grund die 64-Bit-JVM verwenden . Bei einem großen Heap muss der Garbage Collector jedoch mehr Arbeit erledigen. Daher ist es wichtig, ein ausgewogenes Verhältnis zwischen Heap-Größe und Leistung zu finden.

3.2. Wie steuere ich die Heap-Größenbeschränkungen?

Wir haben zwei Möglichkeiten, um die Heap-Größenbeschränkungen einer JVM zu steuern.

Verwenden Sie zunächst Java- Befehlszeilenparameter bei jeder JVM-Initialisierung:

-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.

Für den Größenwert können wir den Buchstaben k oder K , m oder M und g oder G anhängen , um Kilobyte, Megabyte bzw. Gigabyte anzugeben. Wenn kein Buchstabe angegeben ist, wird die Standardeinheit (Byte) verwendet.

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

Zweitens, indem Sie die Umgebungsvariable JAVA_OPTS verwenden , um die obigen Java-Befehlszeilenparameter global zu konfigurieren. Aus diesem Grund verwendet jede JVM-Initialisierung auf dem System automatisch die in der Umgebungsvariablen festgelegten Konfigurationen.

JAVA_OPTS="-Xms256m -Xmx512m"

Weitere Informationen finden Sie in unserem umfassenden Handbuch zu JVM-Parametern.

4. Fazit

In diesem Tutorial haben wir zwei mögliche Szenarien erörtert, in denen JVM nicht genügend Speicherplatz für den Objektheap reservieren kann . Wir haben auch gelernt, wie die Heap-Größenbeschränkungen gesteuert werden, um diesen Fehler zu verringern.

Als Nächstes erfahren Sie mehr über mögliche Speicherprobleme zur Laufzeit und wie Sie diese identifizieren können.