• 我的内存去哪了?


    是今天和朋友讨论的问题,用free看到的内存在减少,但是看/proc/meminfo 的可用内存却没有减少,但是实际情况是他们的应用跑着跑着内存最后就消耗完了,难搞的是复现需要十来天。

    fe1c4522fb005eb3c21be8fddbbe69bb.png

    396fca18e5f9af85936074d568cbdc2f.png

    meminfo里面的memavailable 属性表示的是可以用的内存大小,它是估计出来的值,并不是一个准确值。

    55af9c4d3d28cd3f8ba6414996e174ed.png

    具体链接如下:

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea

    那如果我想确认某个进程有没有出现内存泄漏,我要怎么确认?

    这类问题我一般是遇到的时候才会去分析,进程一般会有自己的进程号,比较简单的办法就是用top -p 进程号判断。

    也可以去看/proc//status 里面的VMRSS属性

    实例:

    1. #include "stdio.h"
    2. #include "stdint.h"
    3. #include "stdlib.h"
    4. #include 
    5. #include <string.h>
    6. #include 
    7. #define MEMSIZE (1024*10)
    8. int main() {
    9.   int *p = NULL;
    10.   unsigned long cnt = 0;
    11.   while(true) {
    12.     p = (int*)malloc(MEMSIZE);
    13.     memcpy(p,&cnt,MEMSIZE);
    14.     sleep(1);
    15.     printf("%ld\n",cnt++);
    16.   }
    17.   return 0;
    18. }

    运行:

    gcc memory.c && a.out

    查看属性:

    2540686323c00353910113813c681108.png

    free 看到的内存信息是从meminfo里面解析出来的,所以要看系统的具体内存占用,还是要看meminfo,但是meminfo里面有很多很多属性,很少有人能够非常明白的说明清楚。

    我尝试说下几个通常见到的

    MemTotal

    这是内存条大小的容量,但是我们往往看到这个值和我们的内存条大小不同,比如,硬件设计的时候告诉我们使用的内存条大小是2GB,实际上这里可能不是2GB,那是因为系统是开机的时候在bootloader,或者其他部分占用了一部分。

    4bdd8afe6bf5bccaf5af62182a507789.png

    c4ca3148979923060db70d3287b7b43f.png

    MemFree

    系统剩余内存大小,MemTotal - MemFree 就是已经使用的内存大小。

    MemAvailable

    这是一个估算值,并不是精确值。

    我们看到的剩余内存MemFree大小,并不是我们系统应用程序可以分配的内存大小,系统中存在的缓存cache/buffer、slab回收内存系统可以从其他地方抠一些内存出来再加上MemFree就等于MemAvailable,应用程序就可以判断这个数值判断自己应该申请的内存空间。

    995b9fd0c950eaaa4ffa01cc56bc413a.jpeg

    79684f894f758148f759defc966bc5e8.jpeg

    da77ea503781e03b98951a35d8a9fe79.gif

  • 相关阅读:
    Scrapy----Scrapy简介
    数据结构——队列
    DevOps&Apipost
    搭建帮助中心系统的关键注意事项
    计算BMI健康指数
    No theme registered! Use AbpThemingOptions to register themes
    使用Flink AggregateFunction计算股票的平均值报错
    LeetCode448:找到所有数组中消失的数字
    机器学习笔记:t-SNE
    【软件设计】软件开发的核心原则
  • 原文地址:https://blog.csdn.net/weiqifa0/article/details/126774731