Estamos tratando de investigar el uso de memoria del proceso de Java bajo carga moderada.
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
Como puede ver, tenemos memoria residente a 6Gb. Ahora la parte interesante es esta: el proceso se ejecuta con estos parámetros:
- -Xmx2048m
- -Xms2048m
- -XX: NewSize = 512m
- -XX: MaxDirectMemorySize = 256m
- ... algunos otros para GC y esas cosas
Al observar estas configuraciones y el uso real de la memoria, nos topamos con la diferencia de lo que esperamos que este proceso use y lo que realmente usa.
Por lo general, nuestros problemas de memoria se resuelven analizando el volcado de almacenamiento dinámico, pero en este caso nuestra memoria se usa en algún lugar fuera del almacenamiento dinámico.
Preguntas: ¿Cuáles serían los pasos para tratar de encontrar la razón de un uso de memoria tan alto? ¿Qué herramientas podrían ayudarnos a identificar qué utiliza la memoria en ese proceso?
EDITAR 0
No parece que este sea un problema relacionado con el montón, ya que todavía tenemos bastante espacio allí:
jmap -heap 12663
resultados en (editado para ahorrar espacio)
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
EDITAR 1
usando el pmap podemos ver que hay bastante cantidad de asignaciones de 64Mb:
pmap -x 12663 | grep rwx | sort -n -k3 | less
resultados 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 ?
Entonces, ¿cómo averiguar cuáles son esos trozos de 64Mb? ¿Qué los está usando? ¿Qué tipo de datos hay en ellos?
Gracias