我有一个在Ubuntu 14.04上运行的ARM 32位C / C ++程序。该程序的最大常驻内存约为90MB。但是,该程序的虚拟内存容量很大-约为400MB。我使用带有x开关的pmap来检查详细信息,我发现并且不太了解的是大约有20-30个虚拟内存块,每个块的大小为8188KB,模式为RWX。每个8188KB块的实际居民大小非常小,类似于8K,12KB,24KB。以下是快照供您参考。
Address Kbytes RSS Dirty Mode Mapping
00010000 12 12 0 r-x-- theApp
00022000 4 4 4 r---- theApp
00023000 4 4 4 rw--- theApp
00024000 3556 3536 3536 rw--- [ anon ]
9941c000 4 0 0 ----- [ anon ]
9941d000 8188 8 8 rwx-- [ anon ]
99c1c000 4 0 0 ----- [ anon ]
99c1d000 8188 8 8 rwx-- [ anon ]
9a41c000 4 0 0 ----- [ anon ]
9a41d000 8188 8 8 rwx-- [ anon ]
9ac1c000 4 0 0 ----- [ anon ]
9ac1d000 8188 8 8 rwx-- [ anon ]
9b41c000 4 0 0 ----- [ anon ]
9b41d000 8188 8 8 rwx-- [ anon ]
9bc1c000 4 0 0 ----- [ anon ]
9bc1d000 8188 24 24 rwx-- [ anon ]
...
b57f6000 28 28 28 rw--- libcrypto.so.1.0.0
b57fd000 12 4 4 rw--- [ anon ]
b5800000 4 0 0 ----- [ anon ]
b5801000 8188 12 12 rwx-- [ anon ]
...
在GDB中,运行后没有任何信息-信息符号“块的地址”。我也将一些数据块转储(转储内存命令),每个位为零。
在该程序中,没有直接调用mmap。它仅显式调用malloc和new进行堆内存分配。而且我没有发现任何内存分配大小为8188KB。实际上,我可以从pmap的输出中识别代码的每个堆分配。当然,该程序还使用了一些我不知道内部实现的第三方共享库。
我的问题是:
任何输入将不胜感激!
谢谢, -尼尔