Wir versuchen, die Speichernutzung des Java-Prozesses unter moderater Last zu untersuchen.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12663 test 20 0 8378m 6.0g 4492 S 43 8.4 162:29.95 java
Wie Sie sehen können, haben wir einen residenten Speicher von 6 GB. Nun ist der interessante Teil der folgende: Der Prozess wird mit diesen Parametern ausgeführt:
- -Xmx2048m
- -Xms2048m
- -XX: NewSize = 512m
- -XX: MaxDirectMemorySize = 256 m
- ... einige andere für GC und so
Wenn wir uns diese Einstellungen und die tatsächliche Speichernutzung ansehen, sind wir erstaunt darüber, welchen Unterschied wir von diesem Prozess erwarten und was er tatsächlich verwendet.
Normalerweise werden unsere Speicherprobleme durch Analysieren des Heap-Dumps gelöst, aber in diesem Fall wird unser Speicher irgendwo außerhalb des Heaps verwendet.
Fragen: Was wären die Schritte, um den Grund für eine so hohe Speichernutzung zu finden? Welche Tools könnten uns dabei helfen, herauszufinden, wie viel Speicher in diesem Prozess verwendet wird?
EDIT 0
Es sieht nicht so aus, als wäre dies ein Heap-Problem, da wir dort noch ziemlich viel Platz haben:
jmap -heap 12663
Ergebnisse in (bearbeitet, um Platz zu sparen)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 536870912 (512.0MB)
MaxNewSize = 536870912 (512.0MB)
OldSize = 1610612736 (1536.0MB)
NewRatio = 7
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
New Generation: 45.7% used
Eden Space: 46.3% used
From Space: 41.4% used
To Space: 0.0% used
concurrent mark-sweep generation: 63.7% used
Perm Generation: 82.5% used
EDIT 1
Wenn wir die pmap benutzen, können wir sehen, dass es eine ganze Menge von Zuweisungen von 64 MB gibt:
pmap -x 12663 | grep rwx | sort -n -k3 | less
Ergebnisse in:
... a lot more of these 64Mb chunks
00007f32b8000000 0 65508 65508 rwx-- [ anon ] <- what are these?
00007f32ac000000 0 65512 65512 rwx-- [ anon ]
00007f3268000000 0 65516 65516 rwx-- [ anon ]
00007f3324000000 0 65516 65516 rwx-- [ anon ]
00007f32c0000000 0 65520 65520 rwx-- [ anon ]
00007f3314000000 0 65528 65528 rwx-- [ anon ]
00000000401cf000 0 241904 240980 rwx-- [ anon ] <- Direct memory ?
000000077ae00000 0 2139688 2139048 rwx-- [ anon ] <- Heap ?
Wie kann man also herausfinden, was diese 64-MB-Chunks sind? Was benutzt sie? Welche Art von Daten sind in ihnen?
Vielen Dank