zoukankan      html  css  js  c++  java
  • linux /proc下的statm、maps、memmap 内存信息文件分析

    ls /proc 能看到一些数字命名的文件夹,这些数字就是对于进程的pid

    [root@localhost proc]# cat /proc/1/statm
    487 185 133 31 0 67 0

    很简单地返回7组数字,每一个的单位都是一页 (常见的是4KB)
    分别是
    size:任务虚拟地址空间大小
    Resident:正在使用的物理内存大小
    Shared:共享页数
    Trs:程序所拥有的可执行虚拟内存大小
    Lrs:被映像倒任务的虚拟内存空间的库的大小
    Drs:程序数据段和用户态的栈的大小
    dt:脏页数量


    接下来看看maps
    [root@localhost proc]# cat /proc/1/maps
    00110000-00111000 r-xp 00110000 00:00 0          [vdso]
    0032b000-00347000 r-xp 00000000 fd:00 852733     /lib/ld-2.8.so
    00347000-00348000 r--p 0001c000 fd:00 852733     /lib/ld-2.8.so
    00348000-00349000 rw-p 0001d000 fd:00 852733     /lib/ld-2.8.so
    0034b000-004ae000 r-xp 00000000 fd:00 852734     /lib/libc-2.8.so
    004ae000-004b0000 r--p 00163000 fd:00 852734     /lib/libc-2.8.so
    004b0000-004b1000 rw-p 00165000 fd:00 852734     /lib/libc-2.8.so
    004b1000-004b4000 rw-p 004b1000 00:00 0 
    08048000-08067000 r-xp 00000000 fd:00 843075     /sbin/init
    08067000-08068000 rw-p 0001e000 fd:00 843075     /sbin/init
    08b42000-08b6a000 rw-p 08b42000 00:00 0          [heap]
    b8046000-b8048000 rw-p b8046000 00:00 0 
    bfb4e000-bfb63000 rw-p bffeb000 00:00 0          [stack]


    一共有6列
    第一列代表内存段的虚拟地址
    第二列代表执行权限,r,w,x不必说,p=私有 s=共享
    不用说,heap和stack段不应该有x,否则就容易被xx,不过这个跟具体的版本有关
    第三列代表在进程地址里的偏移量
    第四列映射文件的主设备号和次设备号
    通过 cat /proc/devices
    得知fd是253 device-mapper


    第五列映像文件的节点号,即inode


    第六列是映像文件的路径
    以前我很奇怪怎么会有两个相同的文件路径,原来
    08048000-08067000 r-xp 00000000 fd:00 843075     /sbin/init
    08067000-08068000 rw-p 0001e000 fd:00 843075     /sbin/init
    一个是只读的,是代码段,一个是读写的,是数据段
    至于为什么共享库分成了三个
    0034b000-004ae000 r-xp 00000000 fd:00 852734     /lib/libc-2.8.so
    004ae000-004b0000 r--p 00163000 fd:00 852734     /lib/libc-2.8.so
    004b0000-004b1000 rw-p 00165000 fd:00 852734     /lib/libc-2.8.so
    其中的004ae000-004b0000 r--p 00163000 fd:00 852734     /lib/libc-2.8.so
    还是不能理解


    最后看看神秘的memmap
    可惜不是所有的版本都有这个文件,如同我这里的情况
    只有口头说一说了,memmap需要和maps配合看
    显示出来的每一行代表maps里的一个段
    每一行的每一个数字,代表那个段里的一个页,段有多大,一行就有对应的多少个数字


    如果这个数字是0,代表系统为其分配了虚拟内存,但是没有分配物理内存
    如果有数字,则代表系统为其分配了物理内存,以及有多少个进程引用了这个页
    当然,不会有负数出现

  • 相关阅读:
    mybatis批量更新报错
    Axure8破解码
    小程序开发-Step1
    2018新年计划
    java 写 Excel(不生成实体文件,写为流的形式)
    git 生成公钥 使用命令行无需输入用户名密码(windows)
    Node.js:上传文件,服务端如何获取文件上传进度
    Express:模板引擎深入研究
    windows下nginx的安装及使用
    Chrome开发者工具详解-Network面板
  • 原文地址:https://www.cnblogs.com/eliu/p/8398525.html
Copyright © 2011-2022 走看看