zoukankan      html  css  js  c++  java
  • free真的释放内存了吗?

    不要天真的想程序中用了free之后,你的程序就会把内存还给了操作系统。从事C编程的人应该要知道,我们所用

    的malloc和free是由glibc提供的。glibc是一个具有系统级感觉的用户级程序,负责管理内存堆区。所以到底把free的

    内存还给还是没还给操作系统,大家还是看malloc和free的源码比较好。
    现在就交大家测试一下malloc和free的方法。

    01 #include <stdlib.h>
    02 #include <stdio.h>
    03
    04 char*ch[1000];
    05
    06 int main(intargc,char*argv[])
    07 {
    08
    09     inti,j;
    10
    11     int size=atoi(argv[1]);
    12
    13     for(i=0; i<1000; ++i)
    14         ch[i]= (char*)malloc(size);    //申请内存
    15
    16     for(i=0; i<1000; ++i)              //换入内存,如不进行操作,glibc并不会真正的向系统申请内存
    17         for(j=0; j<size; ++j)          //这样做是为了去掉glibc对内存管理的优化操作
    18             ch[i][j]='a';
    19
    20     getchar();                         //IO中断,为了给查看进程内存提供时间
    21
    22     for(i=0; i<1000; ++i)              //释放内存
    23         free(ch[i]);
    24
    25     while(1);                          //为了给查看进程内存提供时间
    26
    27     return0;
    28
    29 }

    终端1:
    gcc test.c
    ./a.out 32768
    之后不要敲击任何键

    终端2:
    ps v -C a.out
    我测试的时候,内存利用率大概为8%

    之后,在终端1上敲击一下回车,程序会调用free释放内存。

    在终端2上重新键入ps v -C a.out,会发现内存利用率并没有下降还是8%(看到了吧,free之后是什么样子,并没有

    变)。

    当我们把32768换成65536再试试,你就会发现不一样的情况。看样子glibc在释放的时候是做了阈值限制的,大于

    64K的内存块才是被真正的释放。当然这只是glibc其中的冰山一角。具体那些小一些的块是如何处理的,大家就自

    己研究吧。

  • 相关阅读:
    如何将 asp.net core 应用进行 docker 容器部署
    三步搞定Centos 7 上特定版本的 docker 安装
    docker常用命令整理-在容器中使用service命令
    超简单,Centos7 安装 rabbitMQ
    C# 异步编程4 async与await 异步程序开发
    了解php的session_start的工作原理
    使用php-emoji类让网页显示emoji表情
    php拓展ssh功能
    HTML5的Server-Sent Events功能的使用
    apache的日志查看与开启
  • 原文地址:https://www.cnblogs.com/haolujun/p/2079559.html
Copyright © 2011-2022 走看看