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
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,
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)
Eine ziemlich gute Erklärung zur Speicherverwaltung finden Sie hier: Ссылка
um Ihre Fragen zu beantworten:
Ich verstehe nicht warum,
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.
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:
Tags und Links java memory memory-management heap-memory directmemory