我们正在尝试研究中等负载下Java进程的内存使用情况。
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
如您所见,我们的常驻内存为6Gb。现在有趣的部分是:使用以下参数执行流程:
- -Xmx2048m
- -Xms2048m
- -XX:NewSize = 512m
- -XX:MaxDirectMemorySize = 256m
- ...其他一些用于GC和其他东西的东西
在查看这些设置和实际内存使用量时,我们迷迷糊糊地看到了我们期望此过程使用的内容与实际使用的内容之间的差异。
通常我们的内存问题可以通过分析堆转储来解决,但是在这种情况下,我们的内存用于堆外的某个地方。
问题:尝试找出如此高的内存使用量的原因是什么步骤?哪些工具可以帮助我们确定在此过程中使用什么内存?
编辑0
看起来这不是一个与堆相关的问题,因为我们那里还有很多空间:
jmap -heap 12663
结果(编辑以节省空间)
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
编辑1
使用pmap,我们可以看到有相当多的64Mb分配:
pmap -x 12663 | grep rwx | sort -n -k3 | less
结果是:
... 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 ?
那么如何找出那些64Mb块呢?什么在使用它们?它们中包含什么样的数据?
谢谢