关于进程exit后,内存释放释放的实践
最近碰到一个问题,或许也是小猿们都会碰到的问题:内存泄露。
都知道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后,内存释放释放的实践的更多相关文章
- free()后内存不释放问题 - 内存缓冲池技术(转)
起因 下面这段代码执行后,内存有增无减,增加了200M,iOS平台200M不能接受了 // STL 集合类 void test1() { list<int> mList; for (int ...
- python openpyxl内存不主动释放 ——关闭Excel工作簿后内存依旧(MemoryError)
在openpyxl对Excel读写操作过程中,发现内存没有马上释放,如果得多次读取大文件,内存爪机,后续代码就无法运行. 尝试:各种wb.save()或者with open等途径无法解决. 发现:因为 ...
- 解决IE浏览器IFrame对象内存不释放问题
最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时I ...
- linux 内存清理/释放命令
1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: ...
- java 垃圾回收(堆内存)、以及栈内存的释放
一.Java的垃圾回收机制———解疑 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 需要注意的是:垃圾回收回收的是无任何引用的 ...
- linux memory release commands内存清理/释放命令
linux 内存清理/释放命令 You could find reference from here: http://jingyan.baidu.com/article/597a06436a687f3 ...
- Linux内存(手动释放cache)
项目的扩容申请了一台机器,到手之后看一下机器的指标,看到内存使用情况是这样的. 1.查看内存 free $ free -h total used free shared buffers cached ...
- 解决linux删除文件后空间没有释放问题
linux删除文件后沒有释放空间 今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间沒有变化 os:centos4.7 现象: 发现当前磁盘空间使用情况: [ro ...
- 关于Java Logger类的使用问题 - 内存不释放
原文地址:http://www.ihuxu.com/p/236.html 说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ...
随机推荐
- oracle用户 密码永不过期
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
- 在嵌入式设计中使用MicroBlaze(Vivado版本)
原文Xilinx官方文档<ug898-vivado-embedded-design>第三章 一.MicroBlaze处理器设计介绍(略) 二.创建带有MicroBlaze处理器的IP设计 ...
- maven打包资源文件(转)
原文链接:http://blog.csdn.net/u012849872/article/details/51035938 maven工程标准目录结构: src -main –bin ...
- php中require_once与include_once的区别
首先include_once仅包含文件一次,如果没有文件,会发出警告,并继续执行. 而require_once也是仅包含文件一次,但是如果程序中没有找到文件,则程序会中止执行.
- C# 实现网络时间同步功能
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- Windows7 SP1 64bit配置IIS7.5和ASP.NET4
一.安装前的环境 1. Windows7 SP1 64bit: 2. 在安装IIS7.5之前,安装了Visual Studio 2010或.NET Framework4: 二.安装IIS7.5 1. ...
- flask第二十四篇——模板【6】自定义过滤器
请关注孟船长的公众号:自动化测试实战 大家想了解其他过滤器可以参考这里: http://jinja.pocoo.org/docs/dev/templates/#builtin-filters ---- ...
- 进程的proc文件系统信息
一.实验代码 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include &l ...
- eclipse 3.7 中英文自由切换
最近在学习Java的开发,然后又很多的资料是对于的英文环境讲解,有的资料是对应的中文环境讲解,所以很都对不上号,郁闷啊....... 而且开发的时候,每个人都使用习惯也不相同:有的人喜欢英文界面,有的 ...
- Install LAMP Server (Apache, MariaDB, PHP) On CentOS/RHEL/Scientific Linux 7
Install LAMP Server (Apache, MariaDB, PHP) On CentOS/RHEL/Scientific Linux 7 By SK - August 12, 201 ...