本节主要涉及下面这些概念,搞清楚我们在linux下面写一个应用程序究竟耗费了多少内存,也是我们查内核泄漏的指标。
VSS- Virtual Set Size
RSS- Resident Set Size
PSS- Proportional Set Size
USS- Unique Set Size
在linux 里面大量的存在内存共享的概念,比如我们的libc 库,加入我们有100个程序调用了c 库,linux会把代码段再内存里面共享给这个100个进程使用(动态连接库都是这样),我们把一个程序跑两次,程序的代码段也是共享的,当然数据段是写时拷贝的,当我们再评估一个进程耗费多少内存的时候,我们有必要搞清这些虚的,实的,以及共享的,我们说的进程的内存消耗就是指用户空间耗费的内存,内核空间耗费的内存就是内核消耗的,比如我们做了一个系统调用,这个系统调用申请了很多内存,这个写内存也不属于进程消耗
VMA 表面地址的合法性,和权限,不代表页表里面真实的权限,但是linux的页表中发生page fault时会检测vma,确定是否合法访问,如果合法,申请对应的物理地址映射过来。
这些vma 可能来自程序本身的代码段,数据段,或者动态库。
我们一般用如下方法来查看vma
Linux 下各种page fault,通常分为minor page fault ,和major page fault。第一中只是申请一页内存,第二种不仅要申请内存,还需要读取硬盘,所以这种开销是远大于minor page fault的,从硬件MMU 不区分这个,minor和major 是纯软件的概念。
Linux 这么多进程在跑,每个进程都有各自的页表,下面这张图详细的描述了各个进程是如何瓜分内存条的。有一些是被不同进程共享的,描述一个进程有四个概念,一般说一个进程耗费多少内存,pss是最公平的,uss 一般用于观察内存泄漏就可以了,连续多点采用来判断。在linux 我们一般都是使用smem 这个工具比如 smem -P ^a.out 查看a.out内存消耗情况,嵌入式系统一般用smemcap 抓取tar包,在电脑上查看。
对于内核的内存泄漏是查看slab区域,vmalloc区域是不是在不断变大,内核的泄漏不算在进程上。
4.9 之后的gcc 都带有addresssssanitizer(ASAN) ,他会帮你检查内存申请释放的点,这样程序稍微慢几倍就可以检测内存泄漏的问题
来源:CSDN
作者:MJ牧笛
链接:https://blog.csdn.net/mj5742356/article/details/104136707