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

都知道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. CF 272E Dima and Horses 染色,dfs 难度:2

    http://codeforces.com/problemset/problem/272/E 把仇恨关系想象为边, 因为度只能为0,1,2,3,所以有以下几种 0,1 直接放即可 2: 有(1,1), ...

  2. tortoiseGIT保存用户名密码

    虽然GIT可以使用SSH来免去输入用户名密码的麻烦,但是更多的人我相信还是比较喜欢使用tortoiseGIT. 使用HTTP模式的代码库可以通过保存用户名密码的方式来免去重复输入的麻烦. 首先安装gi ...

  3. LaTeX 之 \label 的运用

    LaTeX 之 \label 的运用 前言 大部分的LaTex教程里面都会提到 \label 的标记功能,而如果入门时就玩耍过WinEdt的同学在工具栏上点击各种环境的时候就会发现\label这个东东 ...

  4. try...except语句

    try: 执行语句 except 执行语句有异常就执行这一步 else: 执行语句没有异常就执行这一步 finally 不管有没有异常,这一步就要执行

  5. opencv之批量转换灰度图并保存

    当图片名字有数字规律时,批量处理方式. ①srcImage 图片名字有规律 ②将srcImage文件下的图片,转换为灰度图并保存入grayImage文件夹. ③ #include <iostre ...

  6. 6款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具

    一.检测工具名称汇总 HDTune ATTO Disk Benchmark CrystalDiskMark AS SSD Benchmark Parkdale CrystalDiskInfo 二.各项 ...

  7. Luogu2435 染色【状压qwq】【轮廓线DP】

    LINK 题目大意 有一个 n 行 m 列的格点图,你需要给每个点上染上 k 种颜色中的一种,要求没有两个相邻点颜色相同.给定第一行与最后一行的染色,试求总染色方案数. 思路 暴力预处理状态暴力转移可 ...

  8. Oracle 通过dblink和job方式实现两个数据库表之间数据同步

    需求是需要将Database_A中的dev_test表中的数据同步到Database_B中的dev_test表中. 因为是通过Database_B去同步Database_A库中的数据,所以操作都建立在 ...

  9. bootstrap table教程--使用入门基本用法

    笔者在查询bootstrap table资料的时候,看了很多文章,发觉很多文章都写了关于如何使用bootstrap table的例子,当然最好的例子还是官网.但是对于某部分技术人员来说,入门还是不够详 ...

  10. 浅谈闭包(Closure)

    一.闭包 好长时间对于闭包都知道与函数和其环境变量有关系,但是一直没有一个清晰的认识.今天查看了一下维基百科,顺便写下来. 二.闭包的定义 在编程语言中,闭包(语义闭包或函数闭包)是指哪些可以将语义范 ...