Ich war immer in der Lage, Java SE unter 32-Bit-Windows XP (Java 1.4, 1.5 und 1.6) 1400 Megabyte zuzuweisen.
java -Xmx1400m ...
Heute habe ich die gleiche Option auf einem neuen Windows XP-Computer mit Java 1.5_16 und 1.6.0_07 ausprobiert und den Fehler erhalten:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Durch Versuch und Irrtum scheint es, dass 1200 Megabyte das Beste sind, was ich auf diesem Computer zuweisen kann.
Irgendwelche Ideen, warum eine Maschine 1400 und eine andere nur 1200 erlauben würde?
Bearbeiten: Der Computer verfügt über 4 GB RAM mit ca. 3,5 GB, die Windows erkennen kann.
Antworten:
Beachten Sie, dass Windows über eine virtuelle Speicherverwaltung verfügt und die JVM nur Speicher benötigt, der in seinem Adressraum zusammenhängend ist . Andere Programme, die auf dem System ausgeführt werden, sollten sich also nicht unbedingt auf Ihre Heap-Größe auswirken. Was Ihnen im Weg steht, sind DLLs, die in Ihren Adressraum geladen werden. Leider erhöhen Optimierungen in Windows, die die Verlagerung von DLLs während der Verknüpfung minimieren, die Wahrscheinlichkeit, dass Sie einen fragmentierten Adressraum haben. Zu den Dingen, die neben den üblichen Dingen wahrscheinlich in Ihren Adressraum eingreifen, gehören Sicherheitssoftware, CBT-Software, Spyware und andere Formen von Malware. Mögliche Ursachen für die Abweichungen sind unterschiedliche Sicherheitspatches, C-Laufzeitversionen usw. Gerätetreiber und andere Kernelbits haben einen eigenen Adressraum (die anderen 2 GB des 4 GB 32-Bit-Raums).
Sie können versuchen, Ihre DLL-Bindungen in Ihrem JVM-Prozess durchzugehen und zu versuchen, Ihre DLLs in einen kompakteren Adressraum umzuwandeln. Kein Spaß, aber wenn Sie verzweifelt sind ...
Alternativ können Sie einfach zu 64-Bit-Windows und einer 64-Bit-JVM wechseln. Ungeachtet dessen, was andere vorgeschlagen haben, wird zwar mehr RAM verbraucht, Sie haben jedoch einen viel zusammenhängenderen virtuellen Adressraum, und die Zuweisung von 2 GB zusammenhängend wäre trivial.
quelle
Dies hat mit zusammenhängendem Speicher zu tun.
Hier sind einige Informationen, die ich online für jemanden gefunden habe, der das zuvor gefragt hat, angeblich von einem "VM-Gott":
quelle
Die Java-Heap-Größenbeschränkungen für Windows sind:
Dies hilft Ihnen nicht dabei, einen größeren Java-Heap zu erhalten, aber jetzt wissen Sie, dass Sie diese Werte nicht überschreiten können.
quelle
Oracle JRockit , das einen nicht zusammenhängenden Heap verarbeiten kann, kann unter Windows 2003 / XP mit dem Schalter / 3 GB eine Java-Heap-Größe von 2,85 GB haben. Es scheint, dass die Fragmentierung einen erheblichen Einfluss darauf haben kann, wie groß ein Java-Heap sein kann.
quelle
Die JVM benötigt zusammenhängenden Speicher. Je nachdem, was noch ausgeführt wird, was zuvor ausgeführt wurde und wie Windows den Speicher verwaltet hat, können Sie möglicherweise bis zu 1,4 GB zusammenhängenden Speicher abrufen. Ich denke, 64-Bit-Windows wird größere Haufen erlauben.
quelle
Die JVM von Sun benötigt zusammenhängenden Speicher. Die maximale Menge an verfügbarem Speicher wird also durch die Speicherfragmentierung bestimmt. Insbesondere DLLs des Treibers neigen dazu, den Speicher zu fragmentieren, wenn sie in eine vordefinierte Basisadresse geladen werden. Ihre Hardware und ihre Treiber bestimmen also, wie viel Speicher Sie erhalten können.
Zwei Quellen dafür mit Aussagen von Sun-Ingenieuren: Forum- Blog
Vielleicht noch eine JVM? Haben Sie Harmony ausprobiert ? Ich denke, sie wollten ein nicht kontinuierliches Gedächtnis zulassen.
quelle
Ich denke, es hat mehr damit zu tun, wie Windows konfiguriert ist, wie in dieser Antwort angedeutet: Java -Xmx Option
Weitere Tests: Ich konnte 1300 MB auf einem alten Windows XP-Computer mit nur 768 MB physischem RAM (plus virtuellem Speicher) zuweisen. Auf meinem 2 GB RAM-Computer kann ich nur 1220 MB bekommen. Auf verschiedenen anderen Unternehmenscomputern (mit älterem Windows XP) konnte ich 1400 MB erhalten. Der Computer mit einem Limit von 1220 MB ist ziemlich neu (gerade von Dell gekauft), daher verfügt er möglicherweise über neuere (und aufgeblähte) Windows- und DLLs (es wird Windows XP Pro Version 2002 SP2 ausgeführt).
quelle
Ich habe diese Fehlermeldung erhalten, wenn ich ein Java-Programm von einem (begrenzten Speicher) virtuozzo VPS ausgeführt habe. Ich hatte keine Speicherargumente angegeben und musste explizit ein kleines festlegen Betrag da der Standardwert zu hoch gewesen sein muss. ZB -Xmx32m (muss natürlich je nach ausgeführtem Programm angepasst werden).
Setzen Sie dies hier ein, falls jemand anderes die obige Fehlermeldung erhält, ohne eine große Speichermenge anzugeben, wie es der Fragesteller getan hat.
quelle
Das JDK / JRE von sun benötigt eine zusammenhängende Speichermenge, wenn Sie einen großen Block zuweisen.
Das Betriebssystem und die ersten Apps neigen dazu, beim Laden Teile zuzuweisen, wodurch der verfügbare RAM fragmentiert wird. Wenn ein zusammenhängender Block NICHT verfügbar ist, kann das SUN JDK ihn nicht verwenden. JRockit von Bea (von Oracle erworben) kann Speicher aus Teilen zuweisen.
quelle
Jeder scheint über zusammenhängende Erinnerungen zu antworten, hat es jedoch versäumt, ein dringlicheres Problem anzuerkennen.
Selbst bei einer zu 100% zusammenhängenden Speicherzuweisung können Sie unter einem 32-Bit-Windows-Betriebssystem (standardmäßig *) keine Heap-Größe von 2 GiB haben. Dies liegt daran, dass 32-Bit-Windows-Prozesse nicht mehr als 2 GB Speicherplatz adressieren können.
Der Java-Prozess enthält neben dem Heap auch Perm-Gen (vor Java 8), Stapelgröße pro Thread, JVM- / Bibliotheks-Overhead (der sich mit jedem Build erheblich erhöht) .
Darüber hinaus ändern sich die JVM-Flags und ihre Standardwerte zwischen den Versionen. Führen Sie einfach Folgendes aus und Sie erhalten eine Vorstellung:
Viele der Optionen wirken sich auf die Speicheraufteilung in und aus dem Heap aus. Sie haben mehr oder weniger von diesen 2 GiB zum Spielen ...
Zur Wiederverwendung Portionen dieser Antwort von mir (etwa Tomcat, sondern gilt für alle Java - Prozess):
quelle
Hier erfahren Sie, wie Sie die Paging-Größe erhöhen
quelle
** Es gibt zahlreiche Möglichkeiten, die Größe des Heapspeichers zu ändern, z.
Was für mich funktioniert hat war
Stellen Sie den richtigen JAVA_HOME-Pfad ein, falls Java aktualisiert wurde.
Neue Systemvariable erstellen Computer-> Eigenschaften-> Erweiterte Einstellungen- > Neue Systemvariable erstellen
Name: _JAVA_OPTION Wert: -Xmx750m
Zu Ihrer Information : Sie finden die Standard-VMoption in der Intellij- Hilfe-> benutzerdefinierte VM-Option bearbeiten . In dieser Datei sehen Sie die minimale und maximale Größe des Heapspeichers. **
quelle
Erstens ist die Verwendung einer Auslagerungsdatei bei 4 GB RAM nutzlos. Windows kann nicht auf mehr als 4 GB zugreifen (tatsächlich weniger aufgrund von Speicherlücken), sodass die Auslagerungsdatei nicht verwendet wird.
Zweitens wird der Adressraum in 2 geteilt, die Hälfte für den Kernel und die Hälfte für den Benutzermodus. Wenn Sie mehr RAM für Ihre Anwendungen benötigen, verwenden Sie die Option / 3GB in der Datei boot.ini (stellen Sie sicher, dass java.exe als "große Adresse bekannt" markiert ist (Google für weitere Informationen).
Drittens können Sie nicht die vollen 2 GB Adressraum zuweisen, da Java intern etwas Speicher verschwendet (für Threads, JIT-Compiler, VM-Initialisierung usw.). Verwenden Sie den Schalter / 3GB für mehr.
quelle