Riesige Systemspeicherauslastung von Java-Anwendungen im Vergleich zur Heap-Auslastung

Ich habe einen Microservice wie Java Framework. Viele Java-Prozesse laufen auf einer einzigen Box (Ubuntu 14.04.4 LTS). Die Java-Prozesse belegen viel Systemspeicher, so dass der Swap-Bereich stark beansprucht wird. Die jstat gc-Berichte erläutern nicht die Speichernutzung des Systems. Alle Java-Prozesse laufen mit den Parametern

-XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90

zwingen, dass die JVM dem System Speicher zurückgibt. Ohne die Parameter bleibt das Problem bestehen. Einige Java-Komponenten verwenden die Nashorn-Engine, um einige Funktionen zu skripten.

Kann hier jemand das Verhalten erklären?

Gibt es irgendwelche JVM-Parameter, die die enorme Speichernutzung des Systems einschränken?

Wie befehle ich dem Betriebssystem, die Speicherzuweisung für den JVM restriktiver zu gestalten?

Daten

Komponente A (mit Nashorn)

oben

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
2400 xxxxxx    20   0 13.933g 807496   7332 S   0.0  2.5   4180:15 java

jstat -gc 2400:

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
512.0  512.0   0.0   400.0  19456.0  12751.6   62464.0    59862.3   89688.0 84866.6 10624.0 9440.4 2165265 15977.896 16816 1813.836 17791.732
Kapazität: Ca. 180 MBgebrauch: Ca. 165 MBsystem Ressourcen: Ca. 800 MB

Warum verwendet die Komponente mehr als das 4-fache des GC-Bereichsspeichers?

Komponente B (ohne Nashorn)

oben

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
19476  xxxx     20   0 13.465g 120436   7836 S   7.0  0.4  22:40.76 java

jstat -gc 19476:

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
512.0  512.0   0.0    0.0   41472.0  25408.7   343040.0    7164.5   17664.0 17183.1 2048.0 1919.4   3650   10.806  939    16.788   27.594
Kapazität: Ca. 403 MBgebrauch: Ca. 52 MBsystemressourcen: 120 MB

Hier sind die Kapazitäten des GC-Bereichs größer als die tatsächliche Speichernutzung des Systems. Trotzdem ist die Speichernutzung des Systems doppelt so hoch wie die der GC-Bereiche. IMO verhält sich diese Komponente normal, da die Bibliotheken usw. auch teilweise in den Arbeitsspeicher abgebildet werden.

Komponente C (ohne Nashorn)

oben

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
2272 xxxxxx    20   0 13.382g 922944  11108 S   0.7  2.8  40033:41 java

jstat -gc 2272:

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1024.0 1024.0 868.0   0.0   36352.0  23866.1   76800.0    56580.2   68864.0 64571.1 8448.0 7460.6 31974159 199295.501 844692 134644.040 333939.541
Kapazität: Ca. 190 MBgebrauch: Ca. 152 MBsystemressourcen: 920 MB

Warum verwendet die Komponente mehr als das 6-fache des GC-Bereichsspeichers?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage