BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #71442同步于 2013/6/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

linux 进程内存使用情况

fuxiang90
2013/6/1镜像同步18 回复
char * str = (char *) malloc(1000000); stpcpy(str,"hello"); free(str); 一个简单的程序,单步跟的时候 ,看使用内存 ,malloc 之前很小,malloc 之后变大 ,free 之后 也没见内存使用变小,这是什么原因 cat /proc/pid/statm or pmap pid =============================== 感谢各位的回复 现在大概弄清楚为什么了 ,linux malloc 如果分配下于128 k 的是用heap 的方式 ,如果大于则直接使用mmap ,前者内存用完了 还继续用进程使用,方便以后再用(管理方式 应该是空闲链表) pmap 看内存内存没有减少 后者 使用完了 则直接还给os 用pmap 可以直接看到内存减少
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
fuxiang90机器人#1 · 2013/6/1
@nuanyangyang 我的收件箱里 看到你回复我 点进来 没有 。你指导下我呗
nuanyangyang机器人#2 · 2013/6/1
@caspar 学长来帮忙回答一下吧。我对自己的理解没有自信……
fuxiang90机器人#3 · 2013/6/1
【 在 nuanyangyang 的大作中提到: 】 : @caspar 学长来帮忙回答一下吧。我对自己的理解没有自信…… 那还是说说把 ,最近开始要 优化自己写的程序的内存使用,之前没有太多这方面的概念。 最后还有移植到windows 下 ,以前同样的程序 win7 用了800M 我在linux 跑只用300M 。我在想 是 win的内存管理搓 还是 我查看内存方法错误 。
tonyjansan机器人#4 · 2013/6/1
这个问题我记得以前有很多帖都问到过~ Windows的内存管理机制是这样的(超级像某些嵌入式系统,所以我一直怀疑这些嵌入式系统是和Windows学的):当系统认为需要内存的时候会从进程空间中回收无用的内存。 你在malloc的时候系统会给进程空间开辟足够大的内存片(扩充堆空间),但是free之后进程并不会主动将内存还给系统,只有系统发现可利用的内存不足以开辟新的内存空间的时候才会去后台或者优先级低的进程中回收内存(有可能是内存置换),否则的话只有这个进程的生命周期结束后才会将内存空间完全交还给系统。 这样做的目的是减少系统和进程间来换交换内存的开销~提高在运行的进程的工作效率~ 至于Windows和Linux下内存占用大小不同的问题嘛~呵呵。。。求上图~~~ 【 在 fuxiang90 的大作中提到: 】 : : 那还是说说把 ,最近开始要 优化自己写的程序的内存使用,之前没有太多这方面的概念。 : 最后还有移植到windows 下 ,以前同样的程序 win7 用了800M 我在linux 跑只用300M 。我在想 是 win的内存管理搓 还是 我查看内存方法错误 。 : ...................
fuxiang90机器人#5 · 2013/6/1
【 在 tonyjansan 的大作中提到: 】 : 这个问题我记得以前有很多帖都问到过~ : Windows的内存管理机制是这样的(超级像某些嵌入式系统,所以我一直怀疑这些嵌入式系统是和Windows学的): : 当系统认为需要内存的时候会从进程空间中回收无用的内存。 : ................... 那我姑且可以这么认为 ,我只需把内存free掉 就ok 。 只是现在做的,用的内存比较多,想比较详细的了解每个部分(主要是开了三个大的结构体数组,其中有一个在完成任务之后 我会free掉 ,最后 要做成一个服务的后台程序,所以我比较关注内存的使用 )占用的内存 ,这个有什么好办法么 ? 再次感谢大神 ,你住哪 我找个机会给你送大果粒 nuanyangyang 也有
fuxiang90机器人#6 · 2013/6/1
b7c2d000 1964K rw--- [ anon ] 这个在不断的malloc free 这个是一直在变 应该是堆的使用内存的大小 fuxiang@fuxiang:~$ pmap 6051 6051: /home/fuxiang/c_data_struct/cdatastruct/bin/Debug/cdatastruct 08048000 8K r-x-- /home/fuxiang/c_data_struct/cdatastruct/bin/Debug/cdatastruct 0804a000 4K r---- /home/fuxiang/c_data_struct/cdatastruct/bin/Debug/cdatastruct 0804b000 4K rw--- /home/fuxiang/c_data_struct/cdatastruct/bin/Debug/cdatastruct b7c2d000 1964K rw--- [ anon ] b7e18000 1676K r-x-- /lib/i386-linux-gnu/libc-2.15.so b7fbb000 4K ----- /lib/i386-linux-gnu/libc-2.15.so b7fbc000 8K r---- /lib/i386-linux-gnu/libc-2.15.so b7fbe000 4K rw--- /lib/i386-linux-gnu/libc-2.15.so b7fbf000 12K rw--- [ anon ] b7fdb000 8K rw--- [ anon ] b7fdd000 4K r-x-- [ anon ] b7fde000 128K r-x-- /lib/i386-linux-gnu/ld-2.15.so b7ffe000 4K r---- /lib/i386-linux-gnu/ld-2.15.so b7fff000 4K rw--- /lib/i386-linux-gnu/ld-2.15.so bffdf000 132K rw--- [ stack ]
tonyjansan机器人#7 · 2013/6/1
7*24的程序还有一些讲究: 如果代码结构比较复杂,在同一个层次结构或几个交错的层次中有多个malloc分配的话,尽量要保证先入后出的关系,例如: void* a = malloc(size_a); void* b = malloc(size_b); void* c = malloc(size_c); free(c); // ... free(b); // ... free(a); 这是因为用malloc来分配的时候,堆内存是按虚拟地址的顺序开辟的,如上例所示,假如malloc了a和b,先free掉了a,这时候在开辟c的时候如果size_c大于size_a的话,a的这片内存就被浪费掉了,这就是内存碎片产生的基本原理。 只要严格按照先入后出的关系,就不会造成内存碎片,这对7*24的程序来说是很重要的! 【 在 fuxiang90 的大作中提到: 】 : : 那我姑且可以这么认为 ,我只需把内存free掉 就ok 。 : 只是现在做的,用的内存比较多,想比较详细的了解每个部分(主要是开了三个大的结构体数组,其中有一个在完成任务之后 我会free掉 ,最后 要做成一个服务的后台程序,所以我比较关注内存的使用 )占用的内存 ,这个有什么好办法么 ? : ...................
ak47机器人#8 · 2013/6/1
释放内存只是说这块内存可以再申请了,倒是内存大小是不变的。
fuxiang90机器人#9 · 2013/6/1
【 在 AK47 的大作中提到: 】 : 释放内存只是说这块内存可以再申请了,倒是内存大小是不变的。 进程每次是 从os 中申请内存,用完并不还给 os ,自己留着用 。 可能我更希望知道 现在的内存实际的适用量 ,因为我的程序里面有比较多 的malloc 恩 谢谢