关于进程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类的示例,完成简单的日志记录功能.代码中有部分类库没有说明,但不影响阅读. 本人技 ...
随机推荐
- 【hive】时间段为五分钟的统计
问题内容 今天遇到了一个需求,需求就是时间段为5分钟的统计.有数据的时间戳.对成交单量进行统计. 想法思路 因为数据有时间戳,可以通过from_unixtime()来获取具体的时间. 有了具体的时间, ...
- bzoj2843&&1180
题解: lct 和上一题差不多 这一题还要判断是否有链接 其实直接并查集判断就可以了 代码: #pragma GCC optimize(2) #include<bits/stdc++.h> ...
- vue: register and import
components/header-nav/menu-nav.vue <template> <div> menu nav </div> </template& ...
- Beta发布
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2408] 视频展示 链接[https://www.cnblogs.com/erc ...
- L203 词汇题
Conditions for the growth of this plant are optimum in early summer.we will live as free people, not ...
- 2018.11.28 RF基础1
1 射频元件 高频电阻: 高频电容: 高频电感: 2 传输线 a 传输线效应:阻抗,3M法则. b 同轴线:RF中用 c 微带线: 常用: 1/4变换线 回波损耗:用网络分析仪测量 插入损耗:传输功率 ...
- 【转】Javascript中的this
作者: 阮一峰 日期: 2010年4月30日 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ ...
- [爬虫] 学Scrapy,顺便把它的官方教程给爬下来
想学爬虫主要是因为算法和数据是密切相关的,有数据之后可以玩更多有意思的事情,数据量大可以挖掘挖掘到更多的信息. 之前只会通过python中的request库来下载网页内容,再用BeautifulSou ...
- 6款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具
一.检测工具名称汇总 HDTune ATTO Disk Benchmark CrystalDiskMark AS SSD Benchmark Parkdale CrystalDiskInfo 二.各项 ...
- CH2101 可达性统计
题意 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 分析 有向无环图,可以按拓扑序逆序统计答案.可以用bitset维护可达性. 时间复杂度\(O(N ...