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

都知道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. POJ 3279 Fliptile 状态压缩,思路 难度:2

    http://poj.org/problem?id=3279 明显,每一位上只需要是0或者1, 遍历第一行的所有取值可能,(1<<15,时间足够)对每种取值可能: 对于第0-n-2行,因为 ...

  2. myeclipse10修改全局jsp编码格式为gbk

    myeclipse10修改全局jsp编码格式为gbk: window->prefenrence->general->content types->  展开:text->j ...

  3. SQL 字符串拆分

    字符串拆分: ALTER FUNCTION [dbo].[f_Split](@sText nvarchar(max),@split NVARCHAR(20)) RETURNS @t TABLE (id ...

  4. ios 怎么禁止点击子视图的时候不响应父视图的点击事件

    方法一 可以在触发手势的方法里添加一个区域的判断,如果点击区域正好是子视图的区域,则过滤掉,不处理此时的手势,如果点击的区域没有被子视图覆盖则,处理手势的事件.具体的代码如下:  if( CGRect ...

  5. ubuntu16 install nginx

    1,更新系统 sudo apt-get update 2,安装nginx sudo apt-get install nginx 3,验证是否安装成功 curl 127.0.0.1 常用配置文件和命令 ...

  6. C++可调用对象与函数表

    c++的可调用对象 有 函数 函数指针 lambda表达式 bind的对象 重载了函数调用运算符的类 如何调用? 函数调用 void afuncToCall() { cout << &qu ...

  7. Mysql的日期转换成星期[某天对应周几]

    |—— 应用中会有各种不同的需求,要灵活应对:比如拿到某一日期要知道是周几 |——DAYOFWEEK(date) [返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六).这些索引值对 ...

  8. POI使用 (4.0) 常用改动

    POI 升级到高版本后,原有的EXCLE导入导出工具类部分代码已不适用,目前只是对我自己写的工具类的过期代码进行更新,以后继续更新 若有问题请指出,再修改 1.数据类型 Cell.CELL_TYPE_ ...

  9. lua 二进制函数使用

    由于 Lua 脚本语言本身不支持对数字的二进制操作(例如 与,或,非 等操作),MUSHclient 为此提供了一套专门用于二进制操作的函数,它们都定义在一个"bit"表中,使用时 ...

  10. WinSCP一个好用的连接linux服务器的

    用虚拟机ssh登陆远程服务器,终端命令copy本地文件到服务器简直弱爆了. 不然用win下的WinSCP,牛逼到爆了.操作跟FTP软件差不多