it-swarm.com.de

Java maximaler Speicher unter Windows XP

Ich war immer in der Lage, 1400 Megabyte für Java SE unter 32-Bit-Windows XP (Java 1.4, 1.5 und 1.6) 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 meiste sind, das ich auf dieser Maschine zuteilen 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.

101
Steve Kuo

Beachten Sie, dass Windows über eine virtuelle Speicherverwaltung verfügt und die JVM nur Speicher benötigt, der zusammenhängend ist im Adressraum. Andere Programme, die auf dem System ausgeführt werden, müssen sich also nicht unbedingt auf die Größe Ihres Heapspeichers auswirken. Was Ihnen in die Quere kommt, sind DLLs, die in Ihren Adressraum geladen werden. Leider machen Optimierungen in Windows, die die Verlagerung von DLLs während der Verknüpfung minimieren, es wahrscheinlicher, dass Sie einen fragmentierten Adressraum haben. Zu den Dingen, die wahrscheinlich in Ihren Adressraum gelangen, gehören neben den üblichen Dingen auch 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 Kernel-Bits haben einen eigenen Adressraum (die anderen 2 GB des 4 GB 32-Bit-Raums).

Sie könnten versuchen, Ihre DLL) -Bindungen in Ihrem JVM-Prozess zu überprüfen und zu versuchen, Ihre DLLs in einen kompakteren Adressraum umzuwandeln sind verzweifelt ...

Alternativ können Sie einfach zu 64-Bit-Windows und einer 64-Bit-JVM wechseln. Ungeachtet dessen, was andere vorgeschlagen haben, werden Sie viel mehr zusammenhängenden virtuellen Adressraum haben, obwohl er mehr RAM aufnimmt, und eine zusammenhängende Zuweisung von 2 GB wäre trivial.

121

Dies hat mit zusammenhängendem Speicher zu tun.

Hier sind einige Informationen, die ich online gefunden habe für jemanden, der das zuvor gefragt hat, angeblich von einem "VM-Gott":

Der Grund, warum wir einen zusammenhängenden Speicherbereich für den Heap benötigen, ist, dass wir eine Reihe von Nebendatenstrukturen haben, die vom Beginn des Heaps an durch (skalierte) Offsets indiziert werden. Beispielsweise verfolgen wir Objektreferenzaktualisierungen mit einem "Kartenmarkierungsarray", das ein Byte für jeweils 512 Bytes Heap enthält. Wenn wir eine Referenz im Heap speichern, müssen wir das entsprechende Byte im Kartenmarkierungs-Array markieren. Wir verschieben die Zieladresse des Speichers nach rechts und verwenden diese, um das Kartenmarkierungsarray zu indizieren. Es macht Spaß, sich mit Rechenspielen zu befassen, die Sie in Java nicht machen können und die Sie in C++ spielen müssen (müssen).

Normalerweise haben wir keine Probleme, bescheidene zusammenhängende Regionen zu erhalten (bis zu 1,5 GB bei Windohs, bis zu 3,8 GB bei Solaris. YMMV.). Unter Windohs besteht das Problem hauptsächlich darin, dass vor dem Start der JVM einige Bibliotheken geladen werden, die den Adressraum aufteilen. Mit dem Schalter/3GB werden diese Bibliotheken nicht wiederhergestellt, sodass sie für uns immer noch ein Problem darstellen.

Wir wissen, wie man Haufenbrocken herstellt, aber die Verwendung dieser Haufen wäre mit einem gewissen Aufwand verbunden. Wir haben mehr Anforderungen an eine schnellere Speicherverwaltung als an größere Heaps in der 32-Bit-JVM. Wenn Sie wirklich große Heaps benötigen, wechseln Sie zur 64-Bit-JVM. Wir benötigen weiterhin zusammenhängenden Speicher, aber es ist viel einfacher, in einen 64-Bit-Adressraum zu gelangen.

50
Uri

Die Java Heap-Größenbeschränkungen für Windows sind:

  • maximal mögliche Größe des Heapspeichers auf 32-Bit-Java: 1,8 GB
  • empfohlen Beschränkung der Heap-Größe auf 32-Bit-Java: 1,5 GB (oder 1,8 GB mit der Option/3 GB)

Dies hilft Ihnen nicht dabei, einen größeren Java Heap zu erhalten, aber jetzt wissen Sie, dass Sie diese Werte nicht überschreiten können.

19
MicSim

Oracle JRockit , das einen nicht zusammenhängenden Heap verarbeiten kann, kann unter Windows 2003/XP mit dem Schalter/3GB eine Java Heap-Größe von 2,85 GB haben. Es scheint, dass Fragmentierung einen erheblichen Einfluss darauf haben kann, wie groß ein Java -Heap sein kann.

10
Kire Haglin

Die JVM von Sun benötigt zusammenhängenden Speicher. Die maximale Größe des verfügbaren Speichers wird also durch die Speicherfragmentierung bestimmt. Insbesondere Treiber-DLLs 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 hierfür mit Aussagen von Sun-Ingenieuren: ForumBlog

Vielleicht noch eine JVM? Haben Sie versucht Harmony ? Ich denke, sie planten, nicht kontinuierliches Gedächtnis zuzulassen.

6
the.duckman

Die JVM benötigt zusammenhängenden Arbeitsspeicher. Abhängig davon, was noch ausgeführt wird, was zuvor ausgeführt wurde und wie Windows den Arbeitsspeicher verwaltet, können Sie möglicherweise bis zu 1,4 GB zusammenhängenden Arbeitsspeicher abrufen. Ich denke, dass 64-Bit-Windows größere Haufen zulässt.

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-Computer XP mit nur 768 MB physischem RAM (plus virtuellem Speicher) zuweisen. Auf meinem 2GB RAM Rechner kann ich nur 1220MB bekommen. Auf verschiedenen anderen Firmencomputern (mit älterem Windows XP) konnte ich 1400MB erreichen. Der Computer mit einem Limit von 1220 MB ist ziemlich neu (er wurde gerade von Dell gekauft), daher sind möglicherweise neuere (und aufgeblähtere) Windows- und DLL-Versionen (auf dem Windows XP Pro Version 2002 SP2 ausgeführt wird) verfügbar.

3
Steve Kuo

Ich habe diese Fehlermeldung erhalten, als ich ein Java) - Programm von einem Virtuozzo VPS (mit begrenztem Speicher) aus ausgeführt habe. Ich hatte keine Speicherargumente angegeben und musste explizit ein kleiner Betrag, da der Standardwert zu hoch sein muss, zB -Xmx32m (muss natürlich abhängig vom ausgeführten Programm angepasst werden).

Stellen Sie dies hier nur für den Fall auf, dass jemand anders die obige Fehlermeldung erhält, ohne eine große Menge an Speicher anzugeben, wie es der Fragesteller getan hat.

2
William Denniss

Das JDK/JRE von Sun benötigt zusammenhängend viel Speicher, wenn Sie einen großen Block zuweisen.

Das Betriebssystem und die ersten Apps neigen dazu, während des Ladens Bits und Teile zuzuweisen, die den verfügbaren RAM fragmentieren. Wenn ein zusammenhängender Block NICHT verfügbar ist, kann er vom Sun JDK nicht verwendet werden. JRockit von Bea (von Oracle erworben) kann Speicher aus Teilen zuordnen.

1
anjanb

Alle scheinen auf zusammenhängende Erinnerungen zu antworten, haben es jedoch versäumt, ein dringenderes Problem anzuerkennen.

Selbst bei 100% zusammenhängender Speicherzuordnung können Sie unter einem 32-Bit-Windows-Betriebssystem (standardmäßig *) keine Heap-Größe von 2 GiB) festlegen, da 32-Bit-Windows-Prozesse dies nicht können mehr als 2 GiB von Raum.

Der Prozess Java) enthält perm gen (pre Java 8), Stack-Größe pro Thread, JVM/Bibliotheks-Overhead (der mit jedem Build ziemlich stark zunimmt) alles zusätzlich zum Haufen .

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 davon:

 Java -XX:+PrintFlagsFinal

Viele der Optionen wirken sich auf die Speicheraufteilung innerhalb und außerhalb des Heapspeichers aus. Sie haben mehr oder weniger von diesen 2 GiB zum Spielen ...

Um Teile von diese meiner Antwort wiederzuverwenden (über Tomcat, gilt aber für jeden Java Prozess):

Das Windows-Betriebssystem begrenzt die Speicherzuordnung eines 32-Bit-Prozesses auf 2 GiB insgesamt (standardmäßig).

[Sie werden nur in der Lage sein], ungefähr 1,5 GiB Heap-Speicherplatz zuzuweisen, da dem Prozess auch anderer Speicher zugewiesen ist (JVM-/Bibliotheks-Overhead, Perm-Speicherplatz usw.).

Warum gibt 32-Bit-Windows eine Beschränkung für den Adressraum von 2 GB vor, während 64-Bit-Windows eine Beschränkung von 4 GB vorschreibt?

Andere moderne Betriebssysteme [cough Linux] ermöglichen es 32-Bit-Prozessen, den gesamten (oder den größten) adressierbaren Speicherplatz von 4 GiB) zu nutzen.

Das heißt, 64-Bit-Windows-Betriebssysteme können so konfiguriert werden, dass die Begrenzung der 32-Bit-Prozesse auf 4 GiB (3 GiB auf 32-Bit)) erhöht wird:

http://msdn.Microsoft.com/en-us/library/windows/desktop/aa366778 (v = vs.85) .aspx

1
Michael

Hier erfahren Sie, wie Sie die Paging-Größe erhöhen

  1. rechtsklick auf mycomputer ---> Eigenschaften ---> Erweitert
  2. klicken Sie im Bereich Leistung auf Einstellungen
  3. klicken Sie auf die Registerkarte Erweitert
  4. klicken Sie im Abschnitt Virtueller Speicher auf Ändern. Es wird Ihre aktuelle Paging-Größe angezeigt.
  5. Wählen Sie Laufwerk, auf dem Festplattenspeicher verfügbar ist.
  6. Geben Sie die Anfangsgröße und die Maximalgröße an ... z. Anfangsgröße 0 MB und maximale Größe 4000 MB. (So ​​viel Sie benötigen)
0