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 MBWarum 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 MBHier 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 MBWarum verwendet die Komponente mehr als das 6-fache des GC-Bereichsspeichers?