免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 13814 | 回复: 20
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-26 16:43 |只看该作者 |正序浏览
如题,想查看我的c程序的资源占用情况,主要是内存,请问怎么查看。。。

只知道查看运行时间是用time,


ps:能不能查看我的堆和栈的使用情况。。。。

论坛徽章:
0
21 [报告]
发表于 2010-04-07 03:22 |只看该作者
man一下 getrusage

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

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

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

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

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



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

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

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



    。。。。。。。。。。。

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



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

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



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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP