免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hsum
打印 上一主题 下一主题

[C] Linux下如何查看我写的c程序占用内存资源情况 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-03-29 22:26 |只看该作者
对于栈上分配的内存,我不知道有什么好方法。但个人认为这部分你不需要关心,因为分配回收时自动的。
对于 ...
zx_wing 发表于 2010-03-27 19:01



    关于栈上内存其实linux并不真正回收这部分内存,一旦内存地址分配给了栈就不能再被分配给堆,而只能被栈重用。当然,一般linux都设置了栈的上限,但如果把栈的上限设置成无穷大了那么这部分内存还是应该被关心的。

论坛徽章:
0
12 [报告]
发表于 2010-03-30 00:19 |只看该作者
/proc/$pid/status
linuxlixk 发表于 2010-03-29 20:56
  1. [root:~]# cat /proc/2333/status
  2. Name:        php-fpm
  3. State:        S (sleeping)
  4. Tgid:        2333
  5. Pid:        2333
  6. PPid:        1607
  7. TracerPid:        0
  8. Uid:        0        0        0        0
  9. Gid:        0        0        0        0
  10. FDSize:        256
  11. Groups:        0
  12. VmPeak:           22668 kB
  13. VmSize:           22668 kB
  14. VmLck:               0 kB
  15. VmHWM:            5372 kB
  16. VmRSS:            5372 kB
  17. VmData:            2044 kB
  18. VmStk:              84 kB
  19. VmExe:            8852 kB
  20. VmLib:            7536 kB
  21. VmPTE:              36 kB
  22. Threads:        1
  23. SigQ:        0/10228
  24. SigPnd:        0000000000000000
  25. ShdPnd:        0000000000000000
  26. SigBlk:        0000000000000000
  27. SigIgn:        0000000000001000
  28. SigCgt:        0000000180014a06
  29. CapInh:        0000000000000000
  30. CapPrm:        ffffffffffffffff
  31. CapEff:        ffffffffffffffff
  32. CapBnd:        ffffffffffffffff
  33. Cpus_allowed:        1
  34. Cpus_allowed_list:        0
  35. Mems_allowed:        1
  36. Mems_allowed_list:        0
  37. voluntary_ctxt_switches:        8980
  38. nonvoluntary_ctxt_switches:        65
复制代码

论坛徽章:
0
13 [报告]
发表于 2010-03-30 10:47 |只看该作者
关于栈上内存其实linux并不真正回收这部分内存,一旦内存地址分配给了栈就不能再被分配给堆,而只 ...
jhzhu_snps 发表于 2010-03-29 22:26



    这个说法可能有问题,因为在进程的虚拟空间地址里面,一块儿是堆使用的,一块儿是栈使用的,两者并不重合,故而不存在栈的地址分配给堆得问题,当然随着栈顶指针的移动,栈地址肯定是重复使用的。

论坛徽章:
0
14 [报告]
发表于 2010-03-30 16:51 |只看该作者
这个说法可能有问题,因为在进程的虚拟空间地址里面,一块儿是堆使用的,一块儿是栈使用的,两者 ...
wwdwwd 发表于 2010-03-30 10:47



    最终的地址空间还是同一个,对于32位的系统来说就是4G。当一个进程用完这4G的地址空间时,通常就是两种情况,要么在增长栈的时候与堆的空间重合了,要么在分配堆的时候与栈的空间重合了。在理想状况下,退栈后的内存应该还能被堆使用,但实际情况并不是这样的。实际情况是,只要某个内存地址曾经被栈使用,即便当前已经不在使用了,这个地址也不会再分配给堆。

论坛徽章:
0
15 [报告]
发表于 2010-03-30 19:16 |只看该作者
最终的地址空间还是同一个,对于32位的系统来说就是4G。当一个进程用完这4G的地址空间时,通常就 ...
jhzhu_snps 发表于 2010-03-30 16:51



    。。。。。。。。。。。

论坛徽章:
0
16 [报告]
发表于 2010-03-30 19:22 |只看该作者
pmap -x ${pid}

论坛徽章:
0
17 [报告]
发表于 2010-03-30 22:02 |只看该作者
。。。。。。。。。。。
zx_wing 发表于 2010-03-30 19:16



    好多泡泡,我们的程序用几十G内存的都很常见。。。。。。。

论坛徽章:
0
18 [报告]
发表于 2010-03-31 21:02 |只看该作者
本帖最后由 zx_wing 于 2010-03-31 21:15 编辑
好多泡泡,我们的程序用几十G内存的都很常见。。。。。。。
jhzhu_snps 发表于 2010-03-30 22:02



    我点是因为你把物理内存和虚拟地址空间搞混淆了。
   在32bit X86你也用不了几十G物理内存,在PAE里,几十G物理内存也无法在用户态操作,因为还是只有4G的虚拟地址空间。在64bit里几十G就不用提了,太小了。
   我点的另外一个原因就是你说的堆和栈的地址空间重叠的情况在linux中根本不会出现,两者中间隔了一个共享库区域,不会重叠

论坛徽章:
0
19 [报告]
发表于 2010-03-31 21:57 |只看该作者
我说的是用完所有虚拟地址空间,也就是当malloc返回0的情况,这个与物理内存的大小无关。

当然我的说法也是简化过的,Linux下栈空间与堆空间并不是严格被共享库所分隔开的,我没有具体研究过,但似乎共享库被load到内存时的地址分配与堆的分配是一样的,通常会看到堆占用的地址空间与共享库占用的地址空间是相互交错的。所以栈在增长的时候完全有可能遇到已经分配给堆的地址空间。

实际上我曾经分析过一个程序,它的行为是堆上曾经分配了大量的内存,但很快都被释放。所以实际上应该有足够的地址空间可以被使用。但由于有一块很靠近栈顶的内存没有被释放,造成栈无法再增长而崩溃。所以我觉得栈和堆的地址空间还是有可能重合的(有一个前提是unlimit 栈的上限)

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
20 [报告]
发表于 2010-04-01 17:59 |只看该作者
上面的观察对Window来说是对,heap/stack并无严格界限,可以 interleave, 对kernel来说,只要
有足够的virtual page就可以分配。 Linux可能受限于UNIX早期的设计,为了保持兼容性采用这种方式,
not sure.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP