Die Frage bezieht sich nicht auf die maximale Heap-Größe eines 32-Bit-Betriebssystems, da 32-Bit-Betriebssysteme eine maximal adressierbare Speichergröße von 4 GB haben und die maximale Heap-Größe der JVM davon abhängt, wie viel zusammenhängender freier Speicher reserviert werden kann.
Ich bin mehr daran interessiert, die maximale (sowohl theoretische als auch praktisch erreichbare) Heap-Größe für eine 32-Bit-JVM zu kennen, die in einem 64-Bit-Betriebssystem ausgeführt wird. Grundsätzlich betrachte ich Antworten ähnlich den Zahlen in einer verwandten Frage zu SO .
Der Grund, warum eine 32-Bit-JVM anstelle einer 64-Bit-JVM verwendet wird, ist nicht technischer, sondern eher administrativer / bürokratischer Natur. Es ist wahrscheinlich zu spät, eine 64-Bit-JVM in der Produktionsumgebung zu installieren.
Sie können die Java Runtime fragen:
Dies meldet den "Maximaler Speicher" basierend auf der Standard-Heap-Zuordnung. Sie müssten also immer noch mit
-Xmx
(auf HotSpot ) spielen. Ich fand, dass unter Windows 7 Enterprise 64-Bit läuft, meine 32-Bit- HotSpot-JVM unter bis zu 1577 MB zuweisen kann:Während mit einer 64-Bit- JVM auf demselben Betriebssystem, ist es natürlich viel höher (ungefähr 3 TB)
Wie andere bereits erwähnt haben, hängt es vom Betriebssystem ab.
Wenn bei einem 64-Bit-Host-Betriebssystem die JVM 32-Bit ist, hängt dies immer noch davon ab, höchstwahrscheinlich wie oben gezeigt.
- UPDATE 20110905 : Ich wollte nur auf einige andere Beobachtungen / Details hinweisen:
Runtime.MaxMemory
, die zugewiesen werden kann, hängt auch vom Arbeitssatz des Betriebssystems ab . Ich habe dies einmal ausgeführt, während VirtualBox ausgeführt wurde, und festgestellt, dass ich die HotSpot-JVM nicht erfolgreich starten konnte-Xmx1590M
und kleiner werden musste. Dies bedeutet auch, dass Sie abhängig von der Größe Ihres Arbeitssatzes zu diesem Zeitpunkt möglicherweise mehr als 1590 MB erhalten (obwohl ich aufgrund des Windows-Designs immer noch davon ausgehe, dass der Wert für 32-Bit unter 2 GB liegt).quelle
Sie geben nicht an, welches Betriebssystem.
Unter Windows (für meine Anwendung - eine lang laufende Risikomanagement-Anwendung) haben wir festgestellt, dass wir unter Windows 32bit nicht weiter als 1280 MB gehen können. Ich bezweifle, dass das Ausführen einer 32-Bit-JVM unter 64-Bit einen Unterschied machen würde.
Wir haben die App auf Linux portiert und führen eine 32-Bit-JVM auf 64-Bit-Hardware aus. Eine 2,2-GB-VM konnte problemlos ausgeführt werden.
Das größte Problem, das Sie möglicherweise haben, ist GC, je nachdem, wofür Sie Speicher verwenden.
quelle
Ab 4.1.2 Heap-Größe :
Ich habe hier eine ziemlich gute Antwort gefunden: Maximaler Java-Speicher unter Windows XP .
quelle
Wir haben kürzlich einige Erfahrungen damit gemacht. Wir haben kürzlich von Solaris (x86-64 Version 5.10) auf Linux (RedHat x86-64) portiert und festgestellt, dass für einen 32-Bit-JVM-Prozess unter Linux weniger Speicher verfügbar ist als für Solaris.
Für Solaris sind es fast 4 GB (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit).
Wir haben unsere App mit -Xms2560m -Xmx2560m -XX: MaxPermSize = 512m -XX: PermSize = 512m ohne Probleme unter Solaris in den letzten Jahren ausgeführt. Wir haben versucht, es auf Linux zu verschieben, und beim Start gab es Probleme mit zufälligen Speicherfehlern. Wir konnten es nur dazu bringen, konsistent auf -Xms2300 -Xmx2300 zu starten . Dann wurden wir durch Unterstützung darauf hingewiesen.
quelle
Die Einschränkungen einer 32-Bit-JVM unter einem 64-Bit-Betriebssystem entsprechen genau den Einschränkungen einer 32-Bit-JVM unter einem 32-Bit-Betriebssystem. Immerhin wird die 32-Bit-JVM in einer virtuellen 32-Bit-Maschine (im Sinne der Virtualisierung) ausgeführt, sodass sie nicht weiß, dass sie auf einem 64-Bit-Betriebssystem / einer 64-Bit-Maschine ausgeführt wird.
Der einzige Vorteil beim Ausführen einer 32-Bit-JVM auf einem 64-Bit-Betriebssystem gegenüber einem 32-Bit-Betriebssystem besteht darin, dass Sie über mehr physischen Speicher verfügen können und daher seltener auf Swapping / Paging stoßen. Dieser Vorteil wird jedoch nur dann wirklich voll ausgeschöpft, wenn Sie mehrere Prozesse haben.
quelle
Als ich für BEA arbeitete, stellten wir fest, dass die durchschnittliche Anwendung in einer 64-Bit-JVM tatsächlich langsamer lief als in einer 32-Bit-JVM. In einigen Fällen war der Leistungseinbruch bis zu 25% langsamer. Wenn Ihre Anwendung nicht wirklich den gesamten zusätzlichen Speicher benötigt, sollten Sie mehr 32-Bit-Server einrichten.
Soweit ich mich erinnere, waren die drei häufigsten technischen Gründe für die Verwendung eines 64-Bit-Systems, auf das BEA Professional Services-Mitarbeiter gestoßen sind:
.
quelle
Die JROCKIT-JVM, die derzeit im Besitz von Oracle ist, unterstützt die nicht zusammenhängende Heap-Nutzung, sodass die 32-Bit-JVM auf mehr als 3,8 GB Speicher zugreifen kann, wenn die JVM unter einem 64-Bit-Windows-Betriebssystem ausgeführt wird. (2,8 GB bei Ausführung unter einem 32-Bit-Betriebssystem).
http://blogs.oracle.com/jrockit/entry/how_to_get_almost_3_gb_heap_on_windows
Die JVM kann unter kostenlos heruntergeladen werden (Registrierung erforderlich)
http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html
quelle
Hier finden Sie einige Tests unter Solaris und Linux 64-Bit
Solaris 10 - SPARC - T5220 Maschine mit 32 GB RAM (und ca. 9 GB frei)
Übrigens: Anscheinend weist Java beim Start nicht viel tatsächlichen Speicher zu. Es schien nur ungefähr 100 MB pro gestarteter Instanz zu dauern (ich habe 10 gestartet)
Solaris 10 - x86 - VMWare VM mit 8 GB RAM (ca. 3 GB frei *)
Der 3 GB freie RAM ist nicht wirklich wahr. Es gibt einen großen Teil des Arbeitsspeichers, den ZFS-Caches verwenden, aber ich habe keinen Root-Zugriff, um zu überprüfen, wie viel genau
RedHat 5.5 - x86 - VMWare VM mit 4 GB RAM (ca. 3,8 GB verwendet - 200 MB in Puffern und 3,1 GB in Caches, also ca. 3 GB frei)
Gleiche Maschine mit JRE 7
quelle
Sollte viel besser sein
Für eine 32-Bit-JVM, die auf einem 64-Bit-Host ausgeführt wird, kann ich mir vorstellen, dass für den Heap der unfragmentierte virtuelle Speicherplatz übrig bleibt, der verfügbar ist, nachdem die JVM, ihre eigenen DLLs und alle 32-Bit-Kompatibilitätsmaterialien für das Betriebssystem geladen wurden. Als wilde Vermutung würde ich denken, dass 3 GB möglich sein sollten, aber wie viel besser das ist, hängt davon ab, wie gut Sie im 32-Bit-Host-Land abschneiden.
Selbst wenn Sie einen riesigen 3-GB-Heap erstellen könnten, möchten Sie dies möglicherweise nicht, da dies dazu führen kann, dass GC-Pausen möglicherweise problematisch werden. Einige Leute betreiben einfach mehr JVMs, um den zusätzlichen Speicher zu nutzen, als einen riesigen. Ich kann mir vorstellen, dass sie gerade die JVMs optimieren, um besser mit riesigen Haufen zu arbeiten.
Es ist ein wenig schwierig, genau zu wissen, wie viel besser Sie tun können. Ich denke, Ihre 32-Bit-Situation kann leicht durch Experimente bestimmt werden. Es ist sicherlich schwer abstrakt vorherzusagen, da viele Dinge eine Rolle spielen, insbesondere weil der auf 32-Bit-Hosts verfügbare virtuelle Speicherplatz eher eingeschränkt ist. Der Heap muss im zusammenhängenden virtuellen Speicher vorhanden sein, also Fragmentierung des Adressraums für DLLs und die interne Verwendung des Adressraums durch den Betriebssystemkern bestimmen den Bereich möglicher Zuordnungen.
Das Betriebssystem verwendet einen Teil des Adressraums für die Zuordnung von HW-Geräten und seine eigenen dynamischen Zuordnungen. Obwohl dieser Speicher nicht dem Adressraum des Java-Prozesses zugeordnet ist, kann der Betriebssystemkernel nicht gleichzeitig auf ihn und Ihren Adressraum zugreifen, sodass die Größe des virtuellen Raums eines Programms begrenzt wird.
Das Laden von DLLs hängt von der Implementierung und der Freigabe der JVM ab. Das Laden des Betriebssystemkerns hängt von einer Vielzahl von Faktoren ab, der Veröffentlichung, der Hardware und der Anzahl der Dinge, die seit dem letzten Neustart bisher zugeordnet wurden. Wer weiß ...
Zusammenfassend
Ich wette, Sie erhalten 1-2 GB in 32-Bit-Land und ungefähr 3 in 64-Bit, also eine allgemeine Verbesserung von ungefähr 2x .
quelle
Unter Solaris lag das Limit seit Solaris 2.5 bei etwa 3,5 GB. (vor ungefähr 10 Jahren)
quelle
Ich hatte dieselben Probleme mit der JVM, die App Inventor für Android Blocks Editor verwendet. Es setzt den Haufen auf 925m max. Dies ist nicht genug, aber ich konnte es nicht mehr als ungefähr 1200 m einstellen, abhängig von verschiedenen zufälligen Faktoren auf meiner Maschine.
Ich habe Nightly, den 64-Bit-Beta-Browser von Firefox, sowie die 64-Bit-Version von JAVA 7 heruntergeladen.
Ich habe mein neues Heap-Limit noch nicht gefunden, aber ich habe gerade eine JVM mit einer Heap-Größe von 5900 m geöffnet . Kein Problem!
Ich verwende Win 7 64-Bit Ultimate auf einem Computer mit 24 GB RAM.
quelle
Ich habe versucht, die Heap-Größe auf einem 32-Bit-Linux-Computer auf 2200 MB einzustellen, und JVM hat einwandfrei funktioniert. Die JVM wurde nicht gestartet, als ich sie auf 2300M eingestellt habe.
quelle
Dies ist schweres Tunning, aber Sie können einen 3-GB-Haufen bekommen.
http://www.microsofttranslator.com/bv.aspx?from=&to=de&a=http://forall.ru-board.com/egor23/online/FAQ/Virtual_Memory/Limits_Virtual_Memory.html
quelle
Ein weiterer Punkt hier für Hotspot-32-Bit-JVM: - Die native Heap-Kapazität = 4 Gig - Java-Heap - PermGen;
Für 32-Bit-JVM kann es besonders schwierig werden, da sich der Java-Heap und der native Heap in einem Rennen befinden. Je größer Ihr Java-Heap ist, desto kleiner ist der native Heap. Der Versuch, einen großen Heap für eine 32-Bit-VM einzurichten, z. B. 2,5 GB +, erhöht das Risiko eines nativen OutOfMemoryError in Abhängigkeit von der Größe Ihrer Anwendung (en), der Anzahl der Threads usw.
quelle
Die Einschränkung ergibt sich auch aus der Tatsache, dass für eine
32 bit
VM dieheap
Adresse selbst bei Adresse Null beginnen muss, wenn Sie alle diese möchten4GB
.Denken Sie darüber nach, wenn Sie etwas referenzieren möchten über:
Das heißt: Eine Referenz mit dieser speziellen Bitdarstellung bedeutet, dass Sie versuchen, vom Heap aus auf den allerersten Speicher zuzugreifen. Damit dies möglich ist, muss der Heap bei Adresse Null beginnen. Aber das passiert nie, es beginnt bei einem Versatz von Null:
Da der Heap in einer niemals mit der Adresse Null beginnt
OS
, gibt es einige Bits, die niemals aus einer32
Bitreferenz verwendet werden, und als solche ist der Heap, auf den verwiesen werden kann, niedriger.quelle
Theoretische 4 GB, aber in der Praxis (für IBM JVM):
Win 2k8 64, IBM Websphere Application Server 8.5.5 32bit
C:\IBM\WebSphere\AppServer\bin>managesdk.bat -listAvailable -verbose CWSDK1003I: Доступные SDK: CWSDK1005I: Имя SDK: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=windows - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 - com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/win /x86_32/ CWSDK1001I: Задача managesdk выполнена успешно. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2036 MaxMemory JVMJ9GC017E -Xmx слишком мала, должна быть не меньше 1 M байт JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось инициализи ровать Could not create the Java virtual machine. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2047M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 2146435072 (2047.0 MiB) Free Memory: 3064536 (2.9225692749023438 MiB) C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2048M MaxMemory JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось создать эк земпляр кучи; запрошено 2G Could not create the Java virtual machine.
RHEL 6.4 64, IBM Websphere Application Server 8.5.5 32-Bit
[bin]./java -Xmx3791M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3975151616 (3791.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [root@nagios1p bin]# ./java -Xmx3793M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3977248768 (3793.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [bin]# /opt/IBM/WebSphere/AppServer/bin/managesdk.sh -listAvailable -verbose CWSDK1003I: Available SDKs : CWSDK1005I: SDK name: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=linux - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 -com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/linux/x86_32/ CWSDK1001I: Successfully performed the requested managesdk task.
quelle