想必在linux上写过程序的同学都有剖析过程占用多少内存的经验,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常咱们能够通过top命令查看过程占用了多少内存。这里咱们能够看到VIRT、RES和SHR三个重要的指标,他们别离代表什么意思呢?这是本文须要跟大家一起探讨的问题。当然如果更加深刻一点,你可能会问过程所占用的那些物理内存都用在了哪些地方?这时候top命令可能不能给到你你所想要的答案了,不过咱们能够剖析proc文件系统提供的smaps文件,这个文件详尽地列出了以后过程所占用物理内存的应用状况。

本文将分为三个局部。

第一局部简要论述虚拟内存和驻留内存这两个重要的概念;

第二局部解释top命令中VIRT、RES以及SHR三个参数的理论参考意义;

最初一部分向大家介绍一下smaps文件的格局,通过剖析smaps文件咱们能够具体理解过程物理内存的应用状况,比方mmap文件占用了多少空间、动态内存开拓耗费了多少空间、函数调用栈耗费了多少空间等等。

对于内存的两个概念

要了解top命令对于内存应用状况的输入,咱们必须首先搞清楚虚拟内存(Virtual Memory)和驻留内存(Resident Memory)两个概念。

虚拟内存

首先须要强调的是虚拟内存不同于物理内存,尽管两者都蕴含内存字眼然而它们属于两个不同层面的概念。过程占用虚拟内存空间大并非意味着程序的物理内存也肯定占用很大。虚拟内存是操作系统内核为了对过程地址空间进行治理(process address space management)而精心设计的一个逻辑意义上的内存空间概念。咱们程序中的指针其实都是这个虚拟内存空间中的地址。比方咱们在写完一段C++程序之后都须要采纳g++进行编译,这时候编译器采纳的地址其实就是虚拟内存空间的地址。因为这时候程序还没有运行,何谈物理内存空间地址?但凡程序运行过程中可能须要用到的指令或者数据都必须在虚拟内存空间中。既然说虚拟内存是一个逻辑意义上(假象的)的内存空间,为了可能让程序在物理机器上运行,那么必须有一套机制能够让这些假象的虚拟内存空间映射到物理内存空间(实实在在的RAM内存条上的空间)。这其实就是操作系统中页映射表(page table)所做的事件了。内核会为零碎中每一个过程保护一份互相独立的页映射表。。页映射表的基本原理是将程序运行过程中须要拜访的一段虚拟内存空间通过页映射表映射到一段物理内存空间上,这样CPU拜访对应虚拟内存地址的时候就能够通过这种查找页映射表的机制拜访物理内存上的某个对应的地址。“页(page)”是虚拟内存空间向物理内存空间映射的根本单元。

下图1演示了虚拟内存空间和物理内存空间的互相关系,它们通过Page Table关联起来。其中虚拟内存空间中着色的局部别离被映射到物理内存空间对应雷同着色的局部。而虚拟内存空间中灰色的局部示意在物理内存空间中没有与之对应的局部,也就是说灰色局部没有被映射到物理内存空间中。这么做也是本着“按需映射”的指导思想,因为虚拟内存空间很大,可能其中很多局部在一次程序运行过程中基本不须要拜访,所以也就没有必要将虚拟内存空间中的这些局部映射到物理内存空间上。

到这里为止曾经根本论述了什么是虚拟内存了。总结一下就是,虚拟内存是一个假象的内存空间,在程序运行过程中虚拟内存空间中须要被拜访的局部会被映射到物理内存空间中。虚拟内存空间大只能示意程序运行过程中可拜访的空间比拟大,不代表物理内存空间占用也大。

图1. 虚拟内存空间到物理内存空间映射

Copy

驻留内存

驻留内存,顾名思义是指那些被映射到过程虚拟内存空间的物理内存。上图1中,在零碎物理内存空间中被着色的局部都是驻留内存。比方,A1、A2、A3和A4是过程A的驻留内存;B1、B2和B3是过程B的驻留内存。过程的驻留内存就是过程实实在在占用的物理内存。个别咱们所讲的过程占用了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。因为虚拟内存大并不意味着占用的物理内存大。

对于虚拟内存和驻留内存这两个概念咱们说到这里。上面一部分咱们来看看top命令中VIRT、RES和SHR别离代表什么意思。

top命令中VIRT、RES和SHR的含意

搞清楚了虚拟内存的概念之后解释VIRT的含意就很简略了。VIRT示意的是过程虚拟内存空间大小。对应到图1中的过程A来说就是A1、A2、A3、A4以及灰色局部所有空间的总和。也就是说VIRT蕴含了在曾经映射到物理内存空间的局部和尚未映射到物理内存空间的局部总和。

RES的含意是指过程虚拟内存空间中曾经映射到物理内存空间的那局部的大小。对应到图1中的过程A来说就是A1、A2、A3以及A4几个局部空间的总和。所以说,看过程在运行过程中占用了多少内存应该看RES的值而不是VIRT的值。

最初来看看SHR所示意的含意。SHR是share(共享)的缩写,它示意的是过程占用的共享内存大小。在上图1中咱们看到过程A虚拟内存空间中的A4和过程B虚拟内存空间中的B3都映射到了物理内存空间的A4/B3局部。咋一看很奇怪。为什么会呈现这样的状况呢?其实咱们写的程序会依赖于很多内部的动静库(.so),比方libc.so、libld.so等等。这些动静库在内存中仅仅会保留/映射一份,如果某个过程运行时须要这个动静库,那么动静加载器会将这块内存映射到对应过程的虚拟内存空间中。多个停顿之间通过共享内存的形式互相通信也会呈现这样的状况。这么一来,就会呈现不同过程的虚拟内存空间会映射到雷同的物理内存空间。这部分物理内存空间其实是被多个过程所共享的,所以咱们将他们称为共享内存,用SHR来示意。某个过程占用的内存除了和别的过程共享的内存之外就是本人的独占内存了。所以要计算过程独占内存的大小只有用RES的值减去SHR值即可。

过程的smaps文件

通过top命令咱们曾经能看出过程的虚拟空间大小(VIRT)、占用的物理内存(RES)以及和其余过程共享的内存(SHR)。然而仅此而已,如果我想晓得如下问题:

过程的虚拟内存空间的散布状况,比方heap占用了多少空间、文件映射(mmap)占用了多少空间、stack占用了多少空间?

过程是否有被替换到swap空间的内存,如果有,被替换进来的大小?

mmap形式关上的数据文件有多少页在内存中是脏页(dirty page)没有被写回到磁盘的?

mmap形式关上的数据文件以后有多少页面曾经在内存中,有多少页面还在磁盘中没有加载到page cahe中?

等等

以上这些问题都无奈通过top命令给出答案,然而有时候这些问题正是咱们在对程序进行性能瓶颈剖析和优化时所须要答复的问题。所幸的是,世界上解决问题的办法总比问题自身要多得多。linux通过proc文件系统为每个过程都提供了一个smaps文件,通过剖析该文件咱们就能够一一答复以上提出的问题。

在smaps文件中,每一条记录(如下图2所示)示意过程虚拟内存空间中一块间断的区域。其中第一行从左到右顺次示意地址范畴、权限标识、映射文件偏移、设施号、inode、文件门路。具体解释能够参见understanding-linux-proc-id-maps。

接下来8个字段的含意别离如下:

Size:示意该映射区域在虚拟内存空间中的大小。

Rss:示意该映射区域以后在物理内存中占用了多少空间

Shared_Clean:和其余过程共享的未被改写的page的大小

Shared_Dirty: 和其余过程共享的被改写的page的大小

Private_Clean:未被改写的公有页面的大小。

Private_Dirty: 已被改写的公有页面的大小。

Swap:示意非mmap内存(也叫anonymous memory,比方malloc动态分配进去的内存)因为物理内存不足被swap到替换空间的大小。

Pss:该虚拟内存区域平摊计算后应用的物理内存大小(有些内存会和其余过程共享,例如mmap进来的)。比方该区域所映射的物理内存局部同时也被另一个过程映射了,且该局部物理内存的大小为1000KB,那么该过程摊派其中一半的内存,即Pss=500KB。

图2. smaps文件中的一条记录

Copy

有了smap如此具体对于虚拟内存空间到物理内存空间的映射信息,置信大家曾经可能通过剖析该文件答复下面提出的4个问题。

最初心愿所有读者可能通过浏览本文对过程的虚拟内存和物理内存有一个更加清晰意识,并能更加精确了解top命令对于内存的输入,最初能够通过smaps文件更进一步剖析过程应用内存的状况。

linux内存机制的virt,关于linux:转载理解virt-res-shr之间的关系相关推荐

  1. 理解virt res shr之间的关系 - linux

    转自:https://www.orchome.com/298 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题--你的程序在运行时占用了多少内存(物理内存)?通常我 ...

  2. Linux 内存机制

    转载链接:http://blog.csdn.net/tianlesoftware/article/details/5463790 一. 内存使用说明 Free 命令相对于top 提供了更简洁的查看系统 ...

  3. Linux内存机制浅见——从内存布局到线程局部存储TLS

    先记 最近在重新分析SGX的源码<再回顾sgx_create_enclave>,一路发现,我还需要重新思考ELF文件格式(我在<SGX初始化中ElfParser::run_parse ...

  4. Java内存溢出故障案例及Linux内存机制探究

    文章目录 Java内存溢出故障案例及Linux内存机制探究 OOM Killer触发机制分析 如何避免系统触发OOM Killer 这部分内容属于demo案例分享,解决线上运维问题,思路是最重要的 J ...

  5. Linux 内存机制以及CPU、内存、硬盘的关系、物理内存以及虚拟内存的关系

    本文有些篇幅较长,但如果认真读下来,相信你会收获颇丰!! document linux内存机制 CPU 内存 虚拟内存 硬盘 物理内存 内存和虚拟内存 跟 Windows 完全不同的 Linux 内存 ...

  6. linux 运行长后内存就满了,关于Linux 内存的使用,你确定真的理解吗?

    原标题:关于Linux 内存的使用,你确定真的理解吗? 作者:coloriy

  7. 深入理解 Linux 内存机制!| 技术头条

    作者 | 阿文 责编 | 郭芮 作为一名Linux 系统运维工程,在日常管理 Linux 的时候,我们经常发现系统的空闲内存差不多总是被用完了. 通常,我们可以通过 top 和 free 查看内存使用 ...

  8. 理解virt、res、shr之间的关系(linux系统篇)

    前言 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题--你的程序在运行时占用了多少内存(物理内存)? 通常我们可以通过top命令查看进程占用了多少内存.这里我们可 ...

  9. linux内存free低cache高,Linux之free命令buff/cache过高

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: free-g 其实:buffers/cache占用的较多,说明 ...

最新文章

  1. 数据结构与算法分析(C++版)(第二版)
  2. 20、Basic Shell_for_while_grep_find
  3. idea ctrl+alt+t快捷键
  4. Java:写2个线程,其中一个线程打印1-52,另一个线程打印A-Z,打印顺序应该是12A34B56C...5152Z。
  5. P2336-[SCOI2012]喵星球上的点名【SA,树状数组】
  6. A - Character Encoding HDU - 6397 - 方程整数解-容斥原理
  7. 启动java服务时刷新缓存_Spring java项目对外提供服务和java进程启动时bean,内部缓存加载的先后关系?...
  8. 收集bug开源框架_百度开源又一力作发布!炸了。。。
  9. native数据类型 react_React-Native 之 数据持久化
  10. 实现在线预览word文档
  11. 赶紧收藏!不可多得的Instagram运营技巧
  12. 西雅图华盛顿大学计算机专业录取,华盛顿大学西雅图分校录取
  13. PHP在线发信投稿系统网站程序
  14. matlab 延迟算子,时间序列分析-----2---时间序列预处理
  15. 不一样的技术人工作、面试指南
  16. MongoDB 分片总结
  17. 目标检测面试常问问题总结
  18. 流越多,带宽利用率越低?
  19. 空心字母金字塔(Java)
  20. android 字符串换行符,\ n(换行符)删除Android

热门文章

  1. 获取Python安装目录
  2. ASP.NET 4.0尚未在Web服务器上注册。您需要手动将Web服务器配置为使用ASP.NET,这样您的网站才能正确运行。...
  3. tcpreplay工具安装使用
  4. 程序员,你的粮草何在?
  5. 使用VC6.0开发COM组件 - 傻瓜式,不讲理论,只讲实例
  6. Python+matplotlib一笔绘制红色五角星
  7. 日程表|第8届高等学校计算机程序设计课程论坛
  8. 1900页Python系列PPT分享七:文件操作(132页)
  9. Python中一定要注意的那些“坑”(三)
  10. 计算机申报专业怎么写,给申请计算机专业的学生的建议