webentwicklung-frage-antwort-db.com.de

Was ist die größtmögliche Heapgröße bei einer 64-Bit-JVM?

Der theoretische maximale Heap-Wert, der in einem 32-Bit-System mit -Xmx eingestellt werden kann, ist natürlich 2^32 Bytes. In der Regel (siehe: Maximale JVM-Heapgröße - 32bit vs. 64bit ) kann jedoch nicht alle 4 GB verwendet werden.

Gibt es für eine 64-Bit-JVM, die in einem 64-Bit-Betriebssystem auf einer 64-Bit-Maschine ausgeführt wird, neben der theoretischen Begrenzung von 2^64 Bytes oder 16 Exabyte eine Begrenzung?

Ich weiß, dass aus verschiedenen Gründen (hauptsächlich Speicherbereinigung) übermäßig große Haufen nicht wise sein könnten, aber angesichts des Lesens von Servern mit Terrabyte-RAM frage ich mich, was möglich ist.

25
Michael McGowan

Wenn Sie 32-Bit-Referenzen verwenden möchten, ist Ihr Heapspeicher auf 32 GB beschränkt.

Wenn Sie jedoch bereit sind, 64-Bit-Referenzen zu verwenden, ist die Größe wahrscheinlich von Ihrem Betriebssystem begrenzt, genau wie bei der 32-Bit-JVM. z.B. Unter Windows 32-Bit sind dies 1,2 bis 1,5 GB.

Hinweis: Sie möchten, dass Ihr JVM-Heap in den Hauptspeicher passt, idealerweise in einer NUMA-Region. Das ist ungefähr 1 TB bei den größeren Maschinen. Wenn Ihre JVM sich über NUMA-Regionen erstreckt, wird der Speicherzugriff und insbesondere der GC viel länger dauern. Wenn Ihr JVM-Heap mit dem Austausch beginnt, kann es Stunden dauern, bis GC ausgeführt wird, oder sogar, dass Ihr Computer unbrauchbar wird, da er das Swap-Laufwerk drosselt.

Hinweis: Sie können auch auf große, direkte Arbeitsspeicher- und Arbeitsspeichergrößen zugreifen, wenn Sie 32-Bit-Verweise in Ihrem Heap verwenden. d.h. deutlich über 32 GB.

Komprimierte oops in der Hotspot-JVM

Komprimierte oops stellen verwaltete Zeiger (an vielen, aber nicht allen Stellen in der JVM) als 32-Bit-Werte dar, die um den Faktor 8 skaliert und zu einer 64-Bit-Basisadresse addiert werden müssen, um das Objekt zu finden, auf das sie sich beziehen. Dadurch können Anwendungen bis zu vier Milliarden Objekte (keine Bytes) oder eine Heap-Größe von bis zu 32 GB adressieren. Gleichzeitig ist die Kompaktheit der Datenstruktur mit dem ILP32-Modus vergleichbar.

21
Peter Lawrey

Die Antwort hängt eindeutig von der JVM-Implementierung ab. Azul behauptet dass ihre JVM

kann skalieren ... auf mehr als ein 1/2 Terabyte Speicher

Mit "können Sie skalieren" scheinen sie "läuft gut" zu bedeuten, im Gegensatz zu "läuft überhaupt".

3
NPE

Windows legt pro Prozess eine Speicherbegrenzung fest. Sie können sehen, was es für jede Version ist. Here

Sehen: 

User-mode virtual address space for each 64-bit process;With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default):x64: 8 TBIntel IPF: 7 TB2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared

1
Andrew

Ich habe versucht, -Xmx32255M wird von vmargs für komprimierte oops akzeptiert.

0
Martin

Gibt es für eine 64-Bit-JVM, die in einem 64-Bit-Betriebssystem auf einer 64-Bit-Maschine ausgeführt wird, neben der theoretischen Beschränkung von 2 ^ 64 Byte oder 16 Exabyte ein beliebiges Limit?

Sie müssen auch Hardware-Grenzwerte berücksichtigen. Während Zeiger 64-Bit-Strom sein dürfen, können CPUs nur einen weniger als 2 ^ 64 Byte virtuellen Speicher adressieren.

Bei unkomprimierten Zeigern benötigt die Hotspot-JVM einen kontinuierlichen virtuellen Adressraum für ihren Heap. Die zweite Hürde nach der Hardware ist das Betriebssystem, das einen so großen Block bietet, der nicht von allen Betriebssystemen unterstützt wird.

Und der dritte ist Praktikabilität. Selbst wenn Sie über so viel virtuellen Speicher verfügen können, bedeutet dies nicht, dass die CPUs so viel physischen Speicher unterstützen, und ohne physischen Speicher werden Sie letztendlich auslagern, was die Leistung der JVM beeinträchtigen kann, da die GCs im Allgemeinen einen großen Bruchteil berühren müssen des Haufens.

Wie andere Antworten erwähnen, dass komprimierte Oops erwähnt werden: Durch Erhöhen der Objektausrichtung von mehr als 8 Byte können die Grenzen bei komprimierten Oops erhöht über 32 GB

0
the8472