Festlegen von MaxDirectMemory und MaxHeapMemory für Java-Anwendungen

8

Bei meiner Java-Anwendung habe ich versucht, den Heap-Speicher zu begrenzen und die Speicherbelegung mithilfe von Befehlszeilenoptionen zu steuern.

Ich stieß auf die folgende VMware Artikel , als ich mehr über das Java-Anwendungsspeicher-Layout zu verstehen versuchte.

In dem Artikel ging ich davon aus, dass die -Xmx-Einstellung verwendet werden kann, um die Heap-Nutzung zu begrenzen, während die MaxDirectMemory-Einstellung verwendet werden kann, um den systemeigenen Speicher außerhalb des Heapspeichers zu beschränken (Guest OS Memory im Diagramm). Aber die Ergebnisse sind anders, wenn ich ein einfaches Programm lief. Ich habe ByteBuffer.allocateDirect verwendet, um nativen Speicher zuzuordnen, während ByteBuffer.allocate hoehlmemory zugewiesen hat.

Es ist ein 64-Bit-Prozessor (OSX) und 64-Bit-JVM.

Erstes Experiment

%Vor%

Wenn ich das obige Programm ohne Optionen ausgeführt habe, ist es nach 3,6G Speicherzuweisung abgestürzt. Wenn ich die Option "-XX: MaxDirectMemorySize = 100g" Option oder "-Xms100g -Xmx100g" verwendete, stürzte sie nach 65 Schleifen oder 65G Speicherzuweisung ab.

Ich verstehe nicht

  1. Da mein physischer RAM nur 16G ist, ist er nach 16G Speicherzuweisung nicht abgestürzt? Was ist das Besondere an 64 GB nativer Speicherzuweisung?
  2. Wie ändern sich native Speicherzuweisungsgrenzen, wenn ich "-Xms100g -Xmx100g" verwende? Ich ging davon aus, dass native Speicherlimits nur durch die Option "" -XX: MaxDirectMemorySize = 100g "gesteuert werden, wie in obigem Diagramm in der Verbindung angegeben. Die Ergebnisse sind jedoch unterschiedlich. Die Größe des Arbeitsspeichers hat auch die Pufferspeichergrenzen geändert.
  3. Was ist das Besondere an der 3.6G-Speicherzuweisung, wenn keine Befehlszeilenoptionen bereitgestellt werden?

Zweites Experiment

Ich habe ByteBuffer.allocateDirect in ByteBuffer.allocate geändert, um in Heap-Speicher anstelle von nativem Speicher zu reservieren.

%Vor%

Wenn ich das obige Programm ohne Optionen ausgeführt habe, stürzte es nach 2.7G Speicherzuweisung ab. Wenn ich die Option "-XX: MaxDirectMemorySize = 100g" verwendet habe, hatte dies keine Auswirkung. Es stürzte nach 2.7G Speicherzuweisung ab. Ich fühlte, das macht Sinn. Aber als ich die Option "-Xms100g -Xmx100g" hinzufügte, stürzte sie nach 48 Schleifen oder 48G Speicherzuweisung ab.

Ich verstehe nicht warum,

  1. Da mein physischer RAM nur 16G ist, ist er nach 16G Speicherzuweisung nicht abgestürzt? Was ist das Besondere an 48G Heapspeicherzuweisung?
  2. Was ist das Besondere an der 2,7G-Speicherzuweisung, wenn keine Befehlszeilenoptionen bereitgestellt werden?

Drittes Experiment

Ich habe sowohl allocateDirect aktiviert als auch Funktionen innerhalb der Schleife zugewiesen. Als ich die Option "-Xms100g -Xmx100g" hinzufügte, stürzte sie nach 24 Schleifen oder effektiv 48G Speicherzuweisung ab, die beide kombinierten. (24G nativen Speicher + 24G Heapspeicher)

Kann mir jemand helfen zu verstehen, wo ich falsch liege, wenn ich das Java-Speicherlayout verstehe? (Verweis auf das Diagramm im Link)

    
GoT 16.12.2016, 04:51
quelle

1 Antwort

6

Eine ziemlich gute Erklärung zur Speicherverwaltung finden Sie hier: Ссылка

um Ihre Fragen zu beantworten:

Ich verstehe nicht warum,

  1. Da mein physischer RAM nur 16G ist, stürzte er nicht nach 16G Speicherzuweisung ab? Was ist das Besondere an 48G Speicherzuweisung?

Physischer Speicher ist nicht die Grenze für das System, es kann Swapping-Technik verwenden. Dadurch kann das System selten geänderte Seiten aus dem physischen Speicher entfernen, damit das System den physischen Speicher für Seiten mit häufigem Zugriff effizienter nutzt.

Das Besondere an 48G ist, dass Ihr System nur mit dieser Speichermenge umgehen kann. Sie können versuchen, mit Überschwemmungen zu spielen und das System alle 100G zuordnen zu lassen.

  1. Was ist das Besondere an der 2,7G-Speicherzuweisung, wenn keine Befehlszeilenoptionen bereitgestellt werden?

Bevor Sie Ihr Java von der Kommandozeile ausführen, überprüfen Sie dies:

Windows

%Vor%

Linux

%Vor%

Sie können auch die visuelle Speicherzuweisung über jconsol überwachen.

Warum verschiedene Speichergrößen gefunden wurden, sollten Sie Folgendes lesen:

ByteBuffer.allocate () und ByteBuffer.allocateDirect ()

    
Saulius Next 03.01.2017 14:22
quelle