最近碰到一个问题,或许也是小猿们都会碰到的问题:内存泄露。

都知道malloc后需要free才能释放内存,shmat后需要shmdt才能断掉内存区并使用IPC_RMID命令删除共享内存。那么如果是当前进程exit后,这些东西还需要收到清理吗?进程退出会清理除打开的文件描述符外,还做些什么呢?

代码:

思路:在进程中申请内存空间不释放,进程退出,查看当期是否有内存释放

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h> //在进程中申请内存空间不释放,进程退出,查看当期是否有内存释放 #define MALLOC_SIZE 1024*100 void ChildProcess()
{
char *p = NULL; p = (char *)malloc(MALLOC_SIZE);//100k if(!p)
{
printf("error to malloc %s\n",strerror(errno));
} memset(p,,MALLOC_SIZE);
p[] = 'M';
printf("=======%p %c======\n",p,p[]); p = NULL; int shmid = shmget(IPC_PRIVATE,MALLOC_SIZE,IPC_CREAT|SHM_R|SHM_W); p = shmat(shmid,NULL,); memset(p,,MALLOC_SIZE);
p[] = 'S';
printf("###########%p %c###########\n",p,p[]); exit();
} int main(void)
{
int i = ;
int ret = ;
signal(SIGCLD, SIG_IGN);
while(++i < )
{
ret = fork(); if(ret == )//child
{
ChildProcess();
}
else if(ret > )//father
{
printf("i have create %d proceses !!\n",i);
sleep();
}
else
{
printf("error to create process %s \n",strerror(errno));
}
} return ;
}

编译运行结果:

[root@localhost UtilLibs]# gcc -o test_leak_memory test_leak_memory.c
[root@localhost UtilLibs]# ./test_leak_memory
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########
i have create proceses !!
=======0x16c0010 M======
###########0x7fb9547db000 S###########

同时,通过ps aux | grep test,得到PID,用命令pmap查看该进程内存使用情况:

[root@localhost ~]# pmap
: ./test_leak_memory
4K r-x-- /mnt/hgfs/e/Lessons/MyExercise/UtilLibs/test_leak_memory
4K rw--- /mnt/hgfs/e/Lessons/MyExercise/UtilLibs/test_leak_memory
000000317c800000 136K r-x-- /lib64/ld-2.14..so
000000317ca21000 4K r---- /lib64/ld-2.14..so
000000317ca22000 4K rw--- /lib64/ld-2.14..so
000000317ca23000 4K rw--- [ anon ]
000000317cc00000 1716K r-x-- /lib64/libc-2.14..so
000000317cdad000 2048K ----- /lib64/libc-2.14..so
000000317cfad000 16K r---- /lib64/libc-2.14..so
000000317cfb1000 8K rw--- /lib64/libc-2.14..so
000000317cfb3000 20K rw--- [ anon ]
00007fd69545d000 12K rw--- [ anon ]
00007fd695475000 8K rw--- [ anon ]
00007fffcaf8d000 132K rw--- [ stack ]
00007fffcafff000 4K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 4124K

结果:

1. 进程退出后,下一个进程重新申请的地址和上一个进程中申请的地址是相同的,也就是说应该是从堆上同一块区域分配使用的。

2. pmap显示,进程的total消耗是不变的。

那么,结论是否可以定为:在多进程编程中,如果子进程主动调用了exit来终止自己,那么该子进程中手动申请的内存就不需要再手动释放啦。欢迎大家交流讨论。

关于进程exit后,内存释放释放的实践的更多相关文章

  1. free()后内存不释放问题 - 内存缓冲池技术(转)

    起因 下面这段代码执行后,内存有增无减,增加了200M,iOS平台200M不能接受了 // STL 集合类 void test1() { list<int> mList; for (int ...

  2. python openpyxl内存不主动释放 ——关闭Excel工作簿后内存依旧(MemoryError)

    在openpyxl对Excel读写操作过程中,发现内存没有马上释放,如果得多次读取大文件,内存爪机,后续代码就无法运行. 尝试:各种wb.save()或者with open等途径无法解决. 发现:因为 ...

  3. 解决IE浏览器IFrame对象内存不释放问题

    最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时I ...

  4. linux 内存清理/释放命令

    1.清理前内存使用情况 free -m 2.开始清理  echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: ...

  5. java 垃圾回收(堆内存)、以及栈内存的释放

    一.Java的垃圾回收机制———解疑 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 需要注意的是:垃圾回收回收的是无任何引用的 ...

  6. linux memory release commands内存清理/释放命令

    linux 内存清理/释放命令 You could find reference from here: http://jingyan.baidu.com/article/597a06436a687f3 ...

  7. Linux内存(手动释放cache)

    项目的扩容申请了一台机器,到手之后看一下机器的指标,看到内存使用情况是这样的. 1.查看内存 free $ free -h total used free shared buffers cached ...

  8. 解决linux删除文件后空间没有释放问题

    linux删除文件后沒有释放空间 今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间沒有变化 os:centos4.7 现象: 发现当前磁盘空间使用情况: [ro ...

  9. 关于Java Logger类的使用问题 - 内存不释放

    原文地址:http://www.ihuxu.com/p/236.html   说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ...

随机推荐

  1. Windows 7 IIS7.5上部署MVC实例

    这段时间在用MVC写一个导游网站,在Window7上部署的时候,遇到和处理了一些问题. 现将完整的过程整理出来,供大家参考: 一.部署准备: 1.安装Microsoft .net FrameWork ...

  2. (UDP)socket编程

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. IP地址分配机构

    IP地址分配机构 全球ip地址分配机构 互联网编号分配机构(IANA,Internet Assigned Numbers Authority)负责分配和规划IP地址,以及对TCP/UDP公共服务的端口 ...

  4. 身份证&银行卡识别方案

    一.  调用第三方服务 腾讯云OCR识别: 实现方法:Post图片 URL到腾讯云服务器.Post图片文件 到腾讯云服务器 b.    报价: 月接口调用总量 0<调用量≤1000 1000&l ...

  5. Beta阶段第2周/共2周 Scrum立会报告+燃尽图 09

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2389] 版本控制:https://git.coding.net/liuyy08 ...

  6. bag of words

    参考文献 Bag-of-words model (BoW model) 最早出现在NLP和IR领域. 该模型忽略掉文本的语法和语序, 用一组无序的单词(words)来表达一段文字或一个文档. 近年来, ...

  7. UITableView-(单元格的自定义方法)

    //contentView //行内容 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS ...

  8. BZOJ4644: 经典傻逼题【线段树分治】【线性基】

    Description 这是一道经典傻逼题,对经典题很熟悉的人也不要激动,希望大家不要傻逼. 考虑一张N个点的带权无向图,点的编号为1到N. 对于图中的任意一个点集 (可以为空或者全集),所有恰好有一 ...

  9. 重新学习之spring第二个程序,配置AOP面向切面编程

    第一步:在配置好的ioc容器的基础上,导入面向切面编程所需要的jar包 (本案例用的是spring3.2.4,由于spring3.2.4的官网jar包中不再有依赖包,所以依赖包都是从网上找的) 第二步 ...

  10. Genymotion使用分析

    1.从官网下载Genymotion Genymotion官方下载地址:https://www.genymotion.com/#!/download 没有注册,先进行注册 公司规模选择个人 2.Andr ...