Frage Warum benötigt der Java VM-Prozess mehr RAM als im Parameter "-Xmx" angegeben?


Ich habe mehrere Server mit CentOS 5.4 und nur eine Anwendung, die auf Java VM läuft. Ich habe die Java VM mit den folgenden Argumenten konfiguriert:

java -Xmx4500M -server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:NewSize=1024m  -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote=true

Die Computer, auf denen ich die VM ausführe, haben 6 GB RAM und keine anderen Anwendungen laufen. Nach einer Weile fängt der Java - Prozess an, den Swap - Bereich wirklich hart zu treffen, ich bekomme diese Informationen aus dem top Befehl:

7658 root      25   0 11.7g 3.9g 4796 S 39.4 67.3 543:54.17 java

Wenn ich dagegen über JConsole eine Verbindung herstelle, meldet es, dass die Java VM 2,6 GB verwendet, 4,6 GB belegt und 4,6 GB maximal.

Java-Version gibt zurück:

java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

Warum erweitert sich die Java-VM so weit über die zugewiesene Heap-Größe hinaus? Und wohin geht diese Erinnerung, wenn sie nicht in JConsole gemeldet wird?


5
2018-05-12 09:57


Ursprung




Antworten:


Ich habe einen Fehler in einigen kommerziellen Java-basierten Anwendungen bemerkt, wo sich die Anwendung in 32bit Java gut benimmt, aber einen extra (und meistens unnötigen) 1,25 GB benötigt, um mit 64bit Java zu beginnen. Was also 256MB in 32Bit Java kostet, dauert bei einer 64Bit Laufzeit 1.5GB.

Ich vermute, dass Java berichtet, was es denkt, die Anwendung verwendet, aber nicht seinen eigenen Laufzeitaufwand, insbesondere in dem Fall, in dem dieser Fehler aufgerufen wird.

Sie könnten versuchen, die App auf einer 32-Bit-Laufzeit auszuführen, oder zurück zum technischen Support des Anbieters gehen (kostet $$) und fragen, was los ist.

Wenn Sie schließlich den Gesamtspeicherbedarf begrenzen, erzwingen Sie nur einen früheren Absturz der App, und Sie haben immer noch ein Problem.


0
2018-05-12 13:24





-Xmx ist die maximale Menge an Heapspeicher, die von der VM verwendet wird. Es enthält keinen Speicher für die geladenen Klassen, das vm selbst oder Stapel von Threads oder den Speicher, der zum Beispiel für das JIT verwendet wird. Die Zeile von oben ist auch irreführend, da die erste Zahl Shared Memory enthielt, die auch von anderen Programmen verwendet wird. Die zweite Zahl 3,9g ist die Einwohnergröße und näher an der Realität.

Meine Empfehlung: Überprüfen Sie, ob Sie wirklich so viel Heap benötigen (Anzahl und Größe der Objekte) und reduzieren Sie die -Xmx-Nummer, wenn Sie können.


2
2017-07-16 15:11



Bemerkenswerterweise enthält es auch keinen "direkten Speicher", der das von "newio" verwendete Platten-Caching enthält. Dies kann summieren, auf einer Solr-Suchmaschine habe ich viele Gigabyte auf diese Weise verwendet. - Dan Pritts