nous essayons d'étudier l'utilisation de la mémoire du processus java sous une charge modérée.
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
Comme vous pouvez le voir, nous avons une mémoire résidente à 6 Go. Maintenant, la partie intéressante est la suivante: le processus est exécuté avec ces paramètres:
- -Xmx2048m
- -Xms2048m
- -XX: NewSize = 512m
- -XX: MaxDirectMemorySize = 256 m
- ... quelques autres pour GC et tout ça
En regardant ces paramètres et l'utilisation réelle de la mémoire, nous sommes trébuchés pour voir la différence entre ce que nous attendons de ce processus et ce qu'il utilise réellement.
Habituellement, nos problèmes de mémoire sont résolus en analysant le vidage de tas, mais dans ce cas, notre mémoire est utilisée quelque part en dehors du tas.
Questions: quelles seraient les étapes pour essayer de trouver la raison d'une telle utilisation de la mémoire? Quels outils pourraient nous aider à identifier ce qui utilise la mémoire dans ce processus?
EDIT 0
Il ne semble pas que ce soit un problème lié au tas car nous avons encore beaucoup d'espace là-bas:
jmap -heap 12663
résulte en (édité pour économiser de l'espace)
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
en utilisant le pmap, nous pouvons voir qu'il existe un certain nombre d'allocations de 64 Mo:
pmap -x 12663 | grep rwx | sort -n -k3 | less
résulte en:
... 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 ?
Alors, comment savoir quels sont ces morceaux de 64 Mo? Qu'est-ce qui les utilise? De quel type de données s'agit-il?
Merci