匿名用户

1级

2016-11-12 回答

linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍/proc系统下内存相关的几个文件

单个进程的内存查看 cat /proc/[pid] 下面有几个文件: maps , smaps, status

maps 文件可以查看某个进程的代码段、栈区、堆区、动态库、内核区对应的虚拟地址,如果你还不了解linux进程的内存空间,可以参考这里。

下图是maps文件内存示例

Develop>cat /proc/self/maps

00400000-0040b000 r-xp 00000000 fd:00 48 /mnt/cf/orig/root/bin/cat

0060a000-0060b000 r--p 0000a000 fd:00 48 /mnt/cf/orig/root/bin/cat

0060b000-0060c000 rw-p 0000b000 fd:00 48 /mnt/cf/orig/root/bin/cat 代码段

0060c000-0062d000 rw-p 00000000 00:00 0 [heap] 堆区

7f1fff43b000-7f1fff5d4000 r-xp 00000000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff5d4000-7f1fff7d3000 ---p 00199000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff7d3000-7f1fff7d7000 r--p 00198000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff7d7000-7f1fff7d9000 rw-p 0019c000 fd:00 861 /mnt/cf/orig/root/lib64/libc-2.15.so

7f1fff7d9000-7f1fff7dd000 rw-p 00000000 00:00 0

7f1fff7dd000-7f1fff7fe000 r-xp 00000000 fd:00 2554 /mnt/cf/orig/root/lib64/ld-2.15.so

7f1fff9f9000-7f1fff9fd000 rw-p 00000000 00:00 0

7f1fff9fd000-7f1fff9fe000 r--p 00020000 fd:00 2554 /mnt/cf/orig/root/lib64/ld-2.15.so

7f1fff9fe000-7f1fff9ff000 rw-p 00021000 fd:00 2554 /mnt/cf/orig/root/lib64/ld-2.15.so

7f1fff9ff000-7f1fffa00000 rw-p 00000000 00:00 0

7fff443de000-7fff443ff000 rw-p 00000000 00:00 0 [stack] 用户态栈区

7fff443ff000-7fff44400000 r-xp 00000000 00:00 0 [vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 内核区

有时候可以通过不断查看某个进程的maps文件,通过查看其虚拟内存(堆区)是否不停增长来简单判断进程是否发生了内存溢出。

maps文件只能显示简单的分区,smap文件可以显示每个分区的更详细的内存占用数据

下图是smaps文件内存示例, 实际显示内容会将每一个区都显示出来,下面我只拷贝了代码段和堆区,

每一个区显示的内容项目是一样的,smaps文件各项含义可以参考这里

Develop>cat /proc/self/smaps

00400000-0040b000 r-xp 00000000 fd:00 48 /mnt/cf/orig/root/bin/cat

Size: 44 kB 虚拟内存大小

Rss: 28 kB 实际使用物理内存大小

Pss: 28 kB

Shared_Clean: 0 kB 页面被改,则是dirty,否则是clean,页面引用计数>1,是shared,否则是private

Shared_Dirty: 0 kB

Private_Clean: 28 kB

Private_Dirty: 0 kB

Referenced: 28 kB

Anonymous: 0 kB

AnonHugePages: 0 kB

Swap: 0 kB 处于交换区的页面大小

KernelPageSize: 4 kB 操作系统一个页面大小

MMUPageSize: 4 kB 体系结构MMU一个页面大小

Locked: 0 kB

0060c000-0062d000 rw-p 00000000 00:00 0 [heap]

Size: 132 kB

Rss: 8 kB

Pss: 8 kB

Shared_Clean: 0 kB

Shared_Dirty: 0 kB

Private_Clean: 0 kB

Private_Dirty: 8 kB

Referenced: 8 kB

Anonymous: 8 kB

AnonHugePages: 0 kB

Swap: 0 kB

KernelPageSize: 4 kB

MMUPageSize: 4 kB

Locked: 0 kB

下图是status文件内存示例, 加粗部分是内存相关的统计,

Develop>cat /proc/24475/status

Name: netio 可执行程序的名字

State: R (running) 任务状态,运行/睡眠/僵死

Tgid: 24475 线程组号

Pid: 24475 进程id

PPid: 19635 父进程id

TracerPid: 0

Uid: 0 0 0 0

Gid: 0 0 0 0

FDSize: 256 该进程最大文件描述符个数

Groups: 0

VmPeak: 6330708 kB 内存使用峰值

VmSize: 268876 kB 进程虚拟地址空间大小

VmLck: 0 kB 进程锁住的物理内存大小,锁住的物理内存无法交换到硬盘

VmHWM: 16656 kB

VmRSS: 11420 kB 进程正在使用的物理内存大小

VmData: 230844 kB 进程数据段大小

VmStk: 136 kB 进程用户态栈大小

VmExe: 760 kB 进程代码段大小

VmLib: 7772 kB 进程使用的库映射到虚拟内存空间的大小

VmPTE: 120 kB 进程页表大小

VmSwap: 0 kB

Threads: 5

SigQ: 0/63346

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000000000

SigIgn: 0000000001000000

SigCgt: 0000000180000000

CapInh: 0000000000000000

CapPrm: ffffffffffffffff

CapEff: ffffffffffffffff

CapBnd: ffffffffffffffff

Cpus_allowed: 01

Cpus_allowed_list: 0

Mems_allowed: 01

Mems_allowed_list: 0

voluntary_ctxt_switches: 201

nonvoluntary_ctxt_switches: 909

可以看到,linux下内存占用是一个比较复杂的概念,不能

简单通过一个单一指标就判断某个程序“内存消耗”大小,原因有下面2点:

进程所申请的内存不一定真正会被用到(malloc或mmap的实现)

真正用到了的内存也不一定是只有该进程自己在用 (比如动态共享库)

关于内存的使用分析及本文几个命令的说明也可以参考这里

下面是查看整机内存使用情况的文件 /proc/meminfo

Develop>cat /proc/meminfo

MemTotal: 8112280 kB 所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)

MemFree: 4188636 kB LowFree与HighFree的总和,被系统留着未使用的内存

Buffers: 34728 kB 用来给文件做缓冲大小

Cached: 289740 kB 被高速缓冲存储器(cache memory)用的内存的大小

(等于 diskcache minus SwapCache )

SwapCached: 0 kB 被高速缓冲存储器(cache memory)用的交换空间的大小

已经被交换出来的内存,但仍然被存放在swapfile中。

用来在需要的时候很快的被替换而不需要再次打开I/O端口

Active: 435240 kB 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,

除非非常必要否则不会被移作他用

Inactive: 231512 kB 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径.

Active(anon): 361252 kB

Inactive(anon): 120688 kB

Active(file): 73988 kB

Inactive(file): 110824 kB

Unevictable: 0 kB

Mlocked: 0 kB

SwapTotal: 0 kB 交换空间的总大小

SwapFree: 0 kB 未被使用交换空间的大小

Dirty: 0 kB 等待被写回到磁盘的内存大小

Writeback: 0 kB 正在被写回到磁盘的内存大小

AnonPages: 348408 kB 未映射页的内存大小

Mapped: 33600 kB 已经被设备和文件等映射的大小

Shmem: 133536 kB

Slab: 55984 kB 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗

SReclaimable: 25028 kB 可收回Slab的大小

SUnreclaim: 30956 kB 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)

KernelStack: 1896 kB 内核栈区大小

PageTables: 8156 kB 管理内存分页页面的索引表的大小

NFS_Unstable: 0 kB 不稳定页表的大小

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 2483276 kB

Committed_AS: 1804104 kB

VmallocTotal: 34359738367 kB 可以vmalloc虚拟内存大小

VmallocUsed: 565680 kB 已经被使用的虚拟内存大小

VmallocChunk: 34359162876 kB

HardwareCorrupted: 0 kB

HugePages_Total: 1536 大页面数目

HugePages_Free: 0 空闲大页面数目

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB 大页面一页大小

DirectMap4k: 10240 kB

DirectMap2M: 8302592 kB

linux 查看内存地址 rw,如何查看Linux内存中的程序所有堆的地址相关推荐

  1. Linux内核的编译方法及如何往内核中增加程序

    2019独角兽企业重金招聘Python工程师标准>>> ARM Linux的系统调用实现原理是采用swi软中断从用户(usr)模式陷入管理模式(svc). 内核空间和用户空间这两个名 ...

  2. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

  3. linux jmap命令详解,jmap命令 linux jmap如何使用

    1, linux jmap如何使用 jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小 ...

  4. Linux arm9 设置中断向量表,STM32学习笔记之中断向量表,MDK程序启动分析

    ;// Stack Configuration ;// Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ;// Stack_Size EQU 0x0000 ...

  5. java中创建类的时候有没有分配内存,你必须了解的java内存管理机制(一)-内存分配...

    前言 在上一篇文章中,我们花了较大的篇幅去介绍了JVM的运行时数据区,并且重点介绍了栈区的结构及作用,相关内容请猛戳!在本文中,我们将主要介绍对象的创建过程及在堆中的分配方式.from 你必须了解的j ...

  6. LINUX下查看CPU、主板、硬盘、内存,网卡信息

    lspci查看硬件信息 在CentOS的最小化安装中,默认是不会安装lspci工具的,需要自己手动安装. 安装步骤: yum  whatprovides  */lspci  /*查找lspci是通过哪 ...

  7. linux 内存查看 kvm,Linux虚拟化KVM-Qemu分析(五)之内存虚拟化

    原标题:Linux虚拟化KVM-Qemu分析(五)之内存虚拟化 背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousa ...

  8. LINUX centos下查看CPU、主板、硬盘、内存,网卡信息

    lspci查看硬件信息 在CentOS的最小化安装中,默认是不会安装lspci工具的,需要自己手动安装. 安装步骤: yum whatprovides */lspci /*查找lspci是通过哪个安装 ...

  9. linux查看内存空间分配情况,也看linux内存去哪儿了

    前两天一台128G内存的oracle主机发生故障触发kdump,最终由于var目录空间不足,导致kdump生成不完全.结合之前redhat给出的建议,crash设置的空间最好大于memory 空间.对 ...

最新文章

  1. 今年大事:年终汇算清缴,你是退还是补?惊喜还是惊吓?
  2. postman 以全局变量活用 Token
  3. Spring中AOP相关的API及源码解析,原来AOP是这样子的
  4. 配置MySQL5.7基于keepalived的GTID的双主复制
  5. 每日程序C语言16-找出比赛对手名单
  6. 如何让某些用户对Marketing Cloud的contact数据只能实施只读操作
  7. 使用NumPy优于Python列表的优势
  8. Flex DES加密
  9. Spring boot中使用log4j记录日志
  10. python自动计算多个教学班的优秀率_第二个月课堂009python之总结(002)
  11. JimuReport积木报表与JeecgBoot集成文档—开源免费的报表工具!
  12. php代码并发控制,php并发控制
  13. 计算机基础知识PDF文档,计算机基础知识(范文).pdf
  14. html下拉框内容变更,Javascript根据另一个下拉框值更改下拉框选项
  15. XP无法显示经典模式控制面板
  16. 数字媒体播放器行业调研报告 - 市场现状分析与发展前景预测
  17. python是什么 自学-Python怎样自学?
  18. shell编程规范与变量
  19. 深圳大数据学习:怎样进行大数据的入门级学习?
  20. 驱动精灵w8ndows xp sp2,爱普生Epson TM-T90打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...

热门文章

  1. MAC下 Android签名生成keystore
  2. 一个扫描器搞定TCP协议所有问题
  3. git pull报错:Your configuration specifies to...from the remote, but no such ref was fetched
  4. HCIP第九天笔记(OSPF的路由回馈、路由策略、以及配置指南)
  5. 【YOLO v4 相关理论】Normalization: BN、CBN、CmBN
  6. 天嵌科技携手爱板网推出年终活动
  7. 用计算机弹传说之下鱼姐的bgm,传说之下决心鱼姐模拟器
  8. 关于CodeBlocks下载了带mingw版本的依旧无法编译运行的解决方案
  9. Mybatis常见错误 Could not find resource com/mybatis/mapper/UserInfoMapper.xml
  10. npm 安装依赖报错解决方法总结