Java-Prozessspeicher ist viel größer als angegeben

Ich habe die meisten verfügbaren Methoden durchgesehen, um herauszufinden, wie viel Arbeitsspeicher ein Java-Prozess tatsächlich benötigt. Bisher kann ich sagen, dass der zugewiesene Gesamtspeicher einer oder mehrere der folgenden Werte sein kann:

Heap-Speicher (angeblich von meinem -XX gesteuert: MaxHeapSize = 4096m)Permanenter Speicher (angeblich von meinem -XX gesteuert: MaxPermSize = 1024m)Reserved Code Cache (angeblich von meinem -XX gesteuert: ReservedCodeCacheSize = 256m)Anzahl der Threads * Threadgröße (angeblich von meinem -XX gesteuert: ThreadStackSize = 1024)

Aber die Ergebnisse unterscheiden sich zu sehr von denen, die mir Linux mit einer der Methoden sagt, die ich gefunden habe, um den Speicherverbrauch eines Java-Prozesses zu ermitteln.

In meinem Fall handelt es sich um eine Tomcat-Instanz, die auf einem Ubuntu 11.10 x86_64-Computer, JVM 1.6_u26 64-Bit undps -ALcf | grep org.apache.catalina.startup.Bootstrap | wc -l teilt mir mit, dass 145 Threads oder Prozesse ausgeführt werden, die alle mit demselben Root-Prozess (Tomcat) verknüpft sind.

Das alles zusammen ergibt einen maximalen Arbeitsspeicher von (4096MB) + (1024MB) + (256MB) + 145 * (1024KB) = 5521MB. Wasjmap -heap PID sagt mir, wasManagementFactory.memoryMXBean.(heapMemoryUsage + nonHeapMemoryUsage).getCommitted() sagt mir, und der theoretische Wert oben sind alle auf Paar.

Nun zur Linux-Seite,top undnmon beide sagen mir, dass der durch diesen Prozess zugewiesene ResidentMemory 5,8 GB beträgt -> ungefähr 5939,2 MB. Aber ich weiß auch, dass dies nur ein Teil des Speichers ist, der Teil im Live-RAM-Speicher. VIRT vontop und Größe vonnmon (beide sollen dasselbe darstellen) sagt mir der prozess ist 7530MB (oder genau 7710952KB vonnmon). Dies unterscheidet sich AUCH vom erwarteten Maximum:2009MB über dem Maximum, und laut jmap und jstat erreichte die Heapspeicherzuweisung nicht einmal ihren Höhepunkt (2048-OldSpace + 1534-Eden _ + _ Survivors).

top sagt mir auch, dass der Code-Stack 36 KB groß ist (fair für den ersten Start von Catalina) und der Daten-Stack 7,3 GB groß ist (für den Rest).

Diese Tomcat-Serverinstanz ist die einzige, die auf diesem Computer ausgeführt wird, und weist eine gewisse Instabilität auf. Muss etwa alle drei Tage neu gestartet werden, da auf dem Computer 7647544 KB RAM zur Verfügung stehen und kein Swap (aus Leistungsgründen). Ich habe die Grenzen berechnet, und da ich davon ausgegangen bin, dass der Prozess ihnen folgen wird, stellte ich fest, dass es ein ziemlich guter Sicherheitsspielraum für alle anderen auf dem Computer ausgeführten Dienste ist (von denen keiner andere als ssh und top selbst stören sollte): 7468 - 5521 = 1947. Das ist fast zu viel für eine "Sicherheitsmarge".

Also möchte ich verstehen, woher all dieser Speicher stammt und warum die Grenze nicht eingehalten wird. Wenn irgendwelche Informationen fehlen, werde ich gerne zur Verfügung stellen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage