我试图使用pmap -x
命令在Linux x86-64上查看进程的内存映射。看着pmap的输出我很困惑。特别是对于映射动态库的条目。它们有多个条目(实际上它们全部为4个,其中一些条目有3个条目)。以下是一个例子
Address Kbytes RSS Dirty Mode Mapping
00000036ca200000 88 64 0 r-x-- libpthread-2.5.so
00000036ca216000 2044 0 0 ----- libpthread-2.5.so
00000036ca415000 4 4 4 r---- libpthread-2.5.so
00000036ca416000 4 4 4 rw--- libpthread-2.5.so
每个库的第二行总是大小为2MB,而没有页面权限。在所有图书馆中,似乎它的RSS始终为零。最后两行也具有相同的大小(基页大小)和相同的权限(少数库没有rw映射)。
有人对此有一些解释吗?我有点意识到,带有只读保护的映射可能由加载器完成,以读取库的元数据,而具有可执行权限的部分实际上是库的代码。我可能错了。
但我对这一中间行没有任何线索。没有许可,没有用法?这里有人有一些智慧的话语吗?
我还看到有几页报告在匿名内存上,没有设置任何模式位。这些代表什么?
答案 0 :(得分:6)
这些受保护的“----”页面是防护页面,用于防止指针在库的代码和数据段之间进行索引。它们只存在于进程的虚拟空间中,并且如果指针遍历段的末尾则存在导致错误。
如果没有将这些文件发送到共享库文件中,我会说它们可以作为缓冲区,用于将分配扩展到例如malloc或堆栈增长。例如,glibc从内核请求大块地址空间用于线程局部分配竞技场然后慢慢地消耗它们以用于malloc'd分配。在一个来自JVM的更大的pmap中,我正在看其中有几十个,每个都遵循一个RW页面或填充两个大型RW分配之间的空间,它们之间的边界随着RW页面的扩展而移动。在X86_64这样的保护页面上可以使用CPU的内存保护系统来捕获错误的指针解引用。
答案 1 :(得分:4)
首先,可能存在这样一种情况:一个相同的进程可以使用多个内存使用实例。我不知道这是不是你想知道的。我已经看到,在Linux中使用浏览器时,只打开一个选项卡,并使用top命令,它在内存使用列表中显示超过4个用法,覆盖超过10mb的内存。我认为它没问题,因为同一进程运行的线程数量更多。
此链接可能很有用,因为在用法示例中,如果您观察到,-x命令的映射会显示更多的使用情况。
http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html