3.Linux内存管理----进程中的内存消耗、泄露_进程 虚拟内存容量泄漏-程序员宅基地

技术标签: Linux内存管理笔记(宋宝华)  

一、VMA(virtual memory area)

1.VMA(虚拟内存空间)概述
    一个进程用结构体task_struct结构体描述。task_struct中包含内存结构体mm_struct ;mm_struct 包含虚拟内存结构体vm_area_struct。
    vm_area_struct中,包含虚拟内存的用户空间的地址范围,以及该内存的操作权限(rwx)。

2.查看进程的VMA信息指令

1、pmap ${
    pid}
2、cat /proc/${
    pid}/maps
3、cat /proc/${
    pid}/smaps | more

3、VMA的组成

1.可执行文件的二进制代码,也就是程序的代码段
2.存储全局变量的数据段
3.用于保存局部变量和实现函数调用的栈
4.环境变量和命令行参数
5.程序使用的动态库的代码
6.用于映射文件内容的区域

refence:
Linux的进程地址空间[二] - VMA
Linux 内存管理窥探(15):虚拟内存 VMA 浅析

二、pagefault(缺页中断)

    当进程空间访问一个虚拟地址时,如果mmu页表中记录的该地址的范围以及权限异常时,会产生缺页中断(pagefault)。在缺页中断中,可以获取到进程要访问的地址以及对应的操作。


(1)产生SEGV(segment fault)的缺页中断:
非法区域:当进程空间的访问地址,不在VMA的地址范围内时
非法权限:当进程空间对一个代码段(只有R+X)进行W(写)操作


(2)不产生SEGV的缺页中断:
minor fault:
    当进程在heap申请到一块内存(权限是R+W),在进行首次W时,由于页表权限是R(此时,mmu将该虚拟地址是映射到0页的),发生page fault;page fault中发现该内存的VMA地址合法,权限合法,于是不向cpu发送SEGV,并申请一页实际的物理内存,MMU将虚拟地址和物理地址做映射并修改页表权限为R+W。

major fault
    当进程首次执行代码段时,会访问代码段的内存地址,产生page fault(和minor fault产生page fault的原理是一样的)。此时page fault中发现 地址合法、权限合法,于是申请一页物理内存,并从磁盘中拷贝数据到该内存当中,MMU将虚拟地址和物理地址做映射并修改页表权限为R+X.

    major fault 和 minor fault 最大不同在于 major fault产生是伴随着IO行为的产生。
    所以刚上电后,首次执行程序时,会发现启动时间较长,因为这个过程伴有较多的major fault;当启动过程序一次后,再次执行时,会比之前快,是因为一些文件已经缓存到内存当中,不会产生较多的major fault,所以启动速度较快。
    Linux 中可以同过time或者\time -v指令来运行一个程序,观察程序运行的时间以及产生的major和minor fault的次数。

三、用户空间的虚拟内存在实际物理内存的分布

1、内存被进程的瓜分图
在这里插入图片描述

    进程1045和1046运行的同一个程序,所以他们两共用用同一个代码段;进程1045、1046、1054共用一个动态库libc

    那么进程1044的内存占用情况如下:
    VSS(虚拟内存) = 1 +2 +3
    RSS(驻留内存,实际的物理内存) = 4 + 5 +6
    PSS(比例化的驻留内存) = 4/3 + 5/2 + 6
    USS(独占的驻留内存) = 6

    VSS>=RSS>=PSS>=USS

    所以看一个进程是否有内存泄露观察USS即可:可以通过smem工具来查看一个进程的USS。
    当一个进程,malloc了100M的内存,但是内存还没有被free掉,进程就被kill掉了,那么这100M的内存是不会泄露掉的。当一个进程被杀掉的时候,他申请的所有内存都会释放掉,所以上面说的情况不用担心存在内存泄露的情况。

四、判断内存泄露

1、判断内存泄露的方法:采用连续多点采样法,一段时间内观察uss是否一直增长
2、寻找内存泄露的步骤:

1、首先通过 /proc/meminfo 或者 free指令 来判断内存是否一直减小
2、然后通过 smem 指令来观察相关进程的uss是否一直在增加
3、如果进程的uss随着时间的增长一直增长,那么就说明进程存在内存泄露;如果没有,说明是内核存在内存泄露
4、如果是进程内存泄露,
   可以通过 valgrind或者gcc中的addressanitizer来寻找内存泄露的位置
5、如果是内核泄露内存,
   可以打开编译选项 KMEME_LEAK 选项,
   通过观察 ①/proc/meminfo 中的 slab、vmalloc 的信息、②slabtop指令、③/proc/slabinfo 
   等信息来判断内存泄露的位置
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010354054/article/details/111089409

智能推荐

oracle表压缩技术(BAISC vs OLTP)_orcale 表 压缩 原理-程序员宅基地

文章浏览阅读1.2k次。oracle压缩技术分为基本表压缩(basic table compression),OLTP表压缩(OLTP table compression),索引压缩(index compression)和混合列压缩(hybrid columnar compression (HCC))。basic compression从9i开始推出,是oracle的默认压缩方式。OLTP compression_orcale 表 压缩 原理

学习大数据需要掌握哪些Java技术_java大数据要学什么-程序员宅基地

文章浏览阅读6.6k次,点赞4次,收藏27次。大数据产业已进入发展的"快车道",急需大量优秀的大数据人才作为后盾。如果你是Java编程出身,那学习大数据自然是锦上添花;但如果你是刚刚接触大数据技术,还在Java编程基础阶段,这篇文章非常值得你看!首先,我们学习大数据,为什么要先掌握Java技术? Java是目前使用非常广泛的编程语言,它具有的众多特性,特别适合作为大数据应用的开发语言。Java不仅吸收了C++语言的各种优点..._java大数据要学什么

什么是SIMD?-程序员宅基地

文章浏览阅读2.5k次。而且猿代码科技也与各个地区的国家超算中心有紧密的合作,例如“无锡国家超算中心”、“天津国家超算中心”等,现向全社会人员以及各个高校在校生提供100个名额,如果你如果你想挣到程序员的高薪,又想有稳定的发展,那请点击下方链接,详细咨询,前50名可得先进计算基础课程,提供面试机会,助你进入目标单位。之后再一次访问内存,取得第二个操作数;CPUID指令是从80486开始才有,之前的CPU没有这条指令,当然这个问题大家大可不必担心,因为你能用到486之前的处理器的机会机乎没有,除非你用模拟器去专门模拟这个处理器。_simd

设有 4道作业,它们的提交时间及执行时间如下,试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。_某批处理系统中有4道作业,他们的提交-程序员宅基地

文章浏览阅读4.4w次,点赞45次,收藏206次。处理机调度算法题目:设有 4道作业,它们的提交时间及执行时间如下:试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。先来先服务(FCFS)调度算法:是最简单的一种调度算法,它不仅可以用于高级调度,也可以用于低级调度。当在作业调度中采用该算法时,每次从作业后备队列中选择一个等待时间最长的作业调入内存,并为其分配资源,建立进程,然后放入就绪队列。这是一种非剥夺式调度算法,易于实现,但效率不高。只顾及作业的等候时间,不_某批处理系统中有4道作业,他们的提交

Android工程方法数超过65535的解决办法_超过最大参数个数(65535)-程序员宅基地

文章浏览阅读757次。解决方案(只针对5.0 之前,项目中minSdkVersion参数设置为20及以下)Dalvik虚拟机限制每个app只能生成一个dex文件,要解决这个问题就要用到官方为我们提供的Multidex库,会自动判断方法是否超过65535个,如果超过了会对其做分包处理。最后都会打包进apk里面。分包后dex文件如下:配置Multidex步骤如下:1.Gradle 配置:app的build.gradle中 android { defaultConfig { appl..._超过最大参数个数(65535)

C# 笔记 MessageBox.Show_c# 更改messagebox.show大小-程序员宅基地

文章浏览阅读284次。DialogResult click = MessageBox.Show("111", "tishi", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (click == DialogResult.Yes) { MessageBox.Show("点了YES"); } else { MessageBox.Show("点了..._c# 更改messagebox.show大小

随便推点

Mysql-使用avg()与if()函数计算正确率_avg(if())-程序员宅基地

文章浏览阅读2.4k次。计算上表中不同难度的题目答题准确率。selectq.difficult_level,avg(if(q.result="right",1,0)) correct_rate#此处平均值计算结果=正确的题目数量/总答题数量from question_detail qgroup by q.difficult_level_avg(if())

由于找不到MSVCR100.dll,msvcr120.dll无法继续执行代码_msvcr20dll-程序员宅基地

文章浏览阅读3.8k次。转自个人博客:https://www.tanchengjin.com/article/108这是由于wamp依赖Microsoft Visual C++ 2010(VC2010运行库)所导致出现MSVCR110.dll错误msvcp、msvcr、vcomp140.dll属于VC++2015版msvcp、msvcr、vcomp120.dll属于VC++2013版..._msvcr20dll

Flink调用dubbo接口写入kafka时遇到的一些问题解决_cannot load user class: org.apache.flink.connector-程序员宅基地

文章浏览阅读457次。Flink调用dubbo接口写入kafka时遇到的一些问题解决org.apache.kafka.common.KafkaException: Failed to construct kafka producer at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:416) at org.apache.kafka.clients.producer.KafkaProducer.<in_cannot load user class: org.apache.flink.connector.rocketmq.sink.table.rocke

汇编(三):DEBUG_汇编debug-程序员宅基地

文章浏览阅读3.1w次,点赞16次,收藏46次。文章目录前言什么是 DEBUG?DEBUG 功能安装 DEBUGR命令D命令E命令U命令T命令A命令后记前言为熟练使用 DEBUG 功能,特展开此次实验,实验内容主要为查看 CPU 和内存,用机器指令和汇编指令编程; 什么是 DEBUG?DEBUG 是 DOS、Windows 都提供的实模式(8086 方式)程序的调试工具。使用它,可以查看 CPU 各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。 DEBUG 功能R 命令查看、改变 CPU 寄存器的内容;D _汇编debug

vue--使用Print.js打印页面样式不出现_printjs打印预览样式变了-程序员宅基地

文章浏览阅读6.4k次。打印变形或字体大小不对解决方案加上这句就好了!完美!_printjs打印预览样式变了

tiktok显示服务器太频繁,TikTok访问太过频繁怎么办?(visiting too frequently)-程序员宅基地

文章浏览阅读5.6k次。最近大家在玩TikTok可能会遇到以下两个问题:ForYou页面黑屏(提示Hot video list is empty),具体的解决方案可以看下我之前的文章【近期TikTok出现黑屏怎么办?让我告诉你!】频繁访问的问题(系统提示:You are visiting our service too frequently,如下图所示),就在我写这篇文章的上午,碰巧就遇到这个问题,所以专门写一下文章来讲..._visit too frequently

推荐文章

热门文章

相关标签