wake-up-neo.com

Grundlegendes zur JVM-Speicherzuordnung und Java Out of Memory: Heap Space

Ich möchte wirklich verstehen, wie die Speicherzuweisung in der JVM funktioniert. Ich schreibe eine Anwendung, in der mir der Speicher ausgeht: Heap Space-Ausnahmen.

Ich verstehe, dass ich VM Argumente wie Xms und Xmx übergeben kann, um den von der JVM für den laufenden Prozess zugewiesenen Heap-Speicherplatz zu erhöhen. Dies ist eine mögliche Lösung für das Problem, oder ich kann überprüfen Mein Code für Speicherlecks und beheben Sie das Problem dort.

Meine Fragen sind:

1) Wie ordnet sich die JVM selbst Speicher zu? In welchem ​​Verhältnis steht das Betriebssystem zur Kommunikation des verfügbaren Arbeitsspeichers mit der JVM? Oder allgemeiner, wie funktioniert die Speicherzuweisung für einen Prozess tatsächlich?

2) Wie kommt der virtuelle Speicher ins Spiel? Angenommen, Sie haben ein System mit 32 GB physischem Speicher und weisen Ihrem Java) - Prozess alle 32 GB zu. Angenommen, Ihr Prozess belegt tatsächlich alle 32 GB Speicher. Wie können wir die Verwendung des Prozesses erzwingen? virtueller Speicher, anstatt auf OOM-Ausnahmen zu stoßen?

Vielen Dank.

24
HiChews123

Wie ordnet sich die JVM selbst Speicher zu?

Für den Heap wird ein großer zusammenhängender Speicherbereich mit der maximalen Größe zugewiesen. Anfangs ist dies ein virtueller Speicher, mit der Zeit wird er jedoch ein realer Speicher für die Teile, die unter der Kontrolle des Betriebssystems verwendet werden

In welchem ​​Verhältnis steht das Betriebssystem zur Kommunikation des verfügbaren Arbeitsspeichers mit der JVM?

Die JVM hat keine Ahnung von freiem Speicher im Betriebssystem.

Oder allgemeiner, wie funktioniert die Speicherzuweisung für einen Prozess tatsächlich?

Im Allgemeinen wird malloc und free verwendet.

Wie kommt der virtuelle Speicher ins Spiel?

Zunächst wird virtueller Speicher zugewiesen und dieser wird bei Verwendung in realen Speicher umgewandelt. Dies ist für jeden Prozess normal.

Angenommen, Sie haben ein System mit 32 GB physischem Speicher und ordnen alle 32 GB Ihrem Java - Prozess zu.

Das kannst du nicht. Das Betriebssystem benötigt etwas Speicher und es wird Speicher für andere Zwecke zur Verfügung stehen. Selbst innerhalb der JVM ist der Heap nur ein Teil des verwendeten Speichers. Wenn Sie 32 GB Speicher haben, schlage ich vor, als 24 GB Heap max.

Angenommen, Ihr Prozess belegt tatsächlich alle 32 GB Arbeitsspeicher.

Angenommen, Sie haben 48 GB und Sie starten einen Prozess, der 32 GB Hauptspeicher verwendet.

wie können wir den Prozess erzwingen, virtuellen Speicher zu verwenden, anstatt auf OOM-Ausnahmen zu stoßen?

Die Anwendung nutzt von Anfang an den virtuellen Speicher. Sie können den Heap nicht zu groß machen, da Ihr Computer (nicht nur Ihre Anwendung) unbrauchbar wird, wenn er mit dem Auslagern beginnt.

Sie können mehr Speicher verwenden als Sie physisch haben, indem Sie den externen Heap-Speicher vorsichtig verwenden. Der verwaltete Speicher muss sich jedoch im physischen Speicher befinden. Wenn Sie also einen 32-GB-Heap benötigen, kaufen Sie 64 GB Hauptspeicher.

23
Peter Lawrey

Die JVM (oder ein beliebiger Prozess), die Speicher zuweisen möchte, ruft die C-Laufzeitfunktion ' malloc ' auf. Diese Funktion verwaltet den Heap-Speicher der C-Laufzeit. Es bezieht seinerseits Speicher vom Betriebssystemkern - die dafür verwendete Funktion ist plattformabhängig; in Linux könnte es die brk oder sbrk Systemaufrufe verwenden.

Sobald der Speicher von der JVM abgerufen wurde, verwaltet sie den Speicher selbst und weist Teile davon den verschiedenen vom ausgeführten Programm erstellten Objekten zu.

Der virtuelle Speicher wird vollständig vom Betriebssystemkern verwaltet. Der Kernel verwaltet die Zuordnung physischer Speicherseiten zum Adressraum verschiedener Prozesse. Wenn weniger physischer Speicher vorhanden ist, als von allen Prozessen im System benötigt wird, tauscht der Betriebssystemkern einen Teil davon auf die Festplatte aus.

Sie können (und müssen) Prozesse nicht zwingen, den virtuellen Speicher zu verwenden. Es ist für Ihren Prozess transparent.

Wenn Sie Fehler aufgrund fehlender Speicherkapazität erhalten, kann dies folgende Ursachen haben:

  1. Die JVM-Grenzwerte werden überschritten. Diese werden durch verschiedene Befehlszeilenargumente und/oder -eigenschaften gesteuert, wie Sie in Ihrer Frage angegeben haben

  2. Dem Betriebssystem ist möglicherweise der Swap-Speicherplatz ausgegangen (oder es ist kein Swap-Speicherplatz für den Anfang konfiguriert). Oder einige Betriebssysteme unterstützen nicht einmal den virtuellen Speicher. In diesem Fall ist der reale Speicher voll.

  3. Die meisten Betriebssysteme verfügen über Funktionen, mit denen der Administrator den von einem Prozess belegten Speicherplatz begrenzen kann. Unter Linux können Sie beispielsweise den Systemaufruf setrlimit und/oder den Befehl ulimit Shell verwenden, die beide die vom Kernel festgelegten Grenzen festlegen werde beobachten. Wenn ein Prozess mehr Speicher anfordert, als nach den Grenzwerten zulässig ist, schlägt der Versuch fehl (dies führt normalerweise zu einer Meldung, dass nicht genügend Speicher vorhanden ist).

7
harmic
  1. Die JVM ordnet Java Heap-Speicher vom Betriebssystem zu und verwaltet dann den Heap-Speicher für die Java Anwendung. Wenn eine Anwendung ein neues Objekt erstellt, ordnet die JVM einen Teil zu Ein zusammenhängender Bereich des Heapspeichers, in dem das Objekt gespeichert werden soll. Ein Objekt im Heap, auf das von einem anderen Objekt verwiesen wird, ist "live" und verbleibt im Heap, solange weiterhin auf es verwiesen wird. Objekte, auf die nicht mehr verwiesen wird, sind Garbage und Die JVM führt eine Garbage Collection (GC) durch, um diese Objekte zu entfernen und die im Heap verbleibenden Objekte neu zu organisieren.
    Quelle: http://pubs.vmware.com/vfabric52/index.jsp?topic=/com.vmware.vfabric.em4j.1.2/em4j/conf-heap-management.html

  2. In einem System mit virtuellem Speicher ist der physische Speicher in Seiten gleicher Größe unterteilt. Der von einem Prozess angesprochene Speicher ist ebenfalls in logische Seiten gleicher Größe unterteilt. Wenn ein Prozess auf eine Speicheradresse verweist, ruft der Speichermanager die Seite mit der angegebenen Adresse von der Festplatte ab und platziert sie auf einer freien physischen Seite im RAM.

Quelle: http://searchstorage.techtarget.com/definition/virtual-memory

2
Little Child

Dieser Blog befasst sich mit Java Speicherauslastung, die Sie vielleicht nützlich finden:

http://www.waratek.com/blog/november-2013/introduction-to-real-world-jvm-memory-utilisation

2
ElastiCat