我试图使用pmap -x命令查看Linuxx86-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映射)。
有人对此有什么解释吗?我有一种感觉,可能只读保护的映射是由加载器完成的,以读取库的元数据,而具有可执行权限的部分实际上是库的代码。不过,我可能错了。
但我对中间那排毫无头绪。没有权限,没有使用?这里有谁有一些智慧的话吗?
我还看到一些页面被报告在匿名内存上,并且没有设置任何模式位。这些代表了什么?
发布于 2012-03-23 13:00:40
首先,可能存在这样的情况,即一个相同的进程可以使用多个内存使用实例。我不知道这是不是你想知道的。我已经看到,在Linux中使用浏览器时,只打开一个选项卡,并使用top命令,它在内存使用列表中显示了4种以上的使用情况,覆盖了超过10mb的内存。我认为这是可以的,因为由同一进程运行的线程数量更多。
这个链接可能很有用,因为在用法示例本身中,如果您观察到,-x命令的映射显示了更多的用法。
http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html
发布于 2015-10-23 20:01:48
这些受保护的“-”页是保护页,以防止指针在库的代码段和数据段之间建立索引。它们只存在于进程的虚拟空间中,存在的目的是为了在指针经过段的末尾时导致错误。
如果这些没有放到一个共享库文件中,我会说它们是一个缓冲区,用于将分配扩展到例如malloc或栈增长。例如,glibc从内核请求大量的地址空间用于线程本地分配区域,然后缓慢地消耗它们用于malloc的分配。在我所看到的来自JVM的更大的pmap中,有几十个这样的页面,每个页面都跟随一个RW页面,或者填充两个大的RW分配之间的空间,并且它们之间的边界随着RW页面的扩展而移动。在X86_64上,像这样的保护页可以使用CPU的内存保护系统来捕获错误的指针引用。
https://stackoverflow.com/questions/9828810
复制相似问题