LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1230|回复: 9

请教内存泄漏的问题:运行free发现可用空间减少

[复制链接]
发表于 2005-5-26 15:47:17 | 显示全部楼层 |阅读模式
下面这个程序执行一次,也就是5000次循环调用foo?()函数,执行前后通过free参看内存,发现可用内存减少了1.2M左右,这是否正常?

如果正常的话,减少的1.2M内存为何得不到释放呢?这个应该由内核负责释放的吧。

如果是内存泄漏,那会哪些原因导致的呢?请举点常见的错误编码。谢谢!
(我已经用memwatch和valgrind查过,未发现内存泄漏现象)

void main()
{
int t=0;
while(t++<5000){
foo1();
foo2();
}
}


另外,这样判断内存泄漏是否正确?
以single用户登陆,只运行需要测试的程序。在执行程序前后用free查看used和free Mem, 通过查看used/free 内存值的变化来判断。
如果发现free内存减少,是不是就可以断定内存泄漏了呢?
发表于 2005-5-26 15:54:43 | 显示全部楼层
用free时,有没有考虑缓冲和缓存的部分内存?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-26 16:01:32 | 显示全部楼层
我是在运行程序前和程序结束后分别运行free的,发现执行程序后可用内存空间比运行前减少了约1.2M.我没有注意缓冲和缓存数据。

你的意思我不太理解,能够详细点吗?谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-5-26 16:13:21 | 显示全部楼层
Linux会尽量把没有使用的内存当作缓冲,以便减少程序I/O操作的次数。
内存泄漏是发生在程序运行时,你的程序已经结束,即使发生泄漏,在进程结束时也已经被操作系统回收了。你这样是看不出内存是否真正发生了泄漏的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-26 16:24:57 | 显示全部楼层
那我该如何判断是否内存泄漏呢?只能通过一直运行看看是否产生OOM错误来判断吗?
当作缓冲的那部分内存,是不是还会被系统释放?

得去找点Linux下内存、缓冲、缓存相关资料看看了
回复 支持 反对

使用道具 举报

发表于 2005-5-26 16:33:51 | 显示全部楼层
你从什么地方感觉到程序出现内在泄漏了?你不是已经用工具检查过了吗?
作缓冲的部分内存,由操作系统自己管理。不需要用户操心。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-26 17:10:39 | 显示全部楼层
因为之前在程序运行期间,也用top实时查看过,发现可用内存不断减少,而且在程序执行完退出后,该部分内存并没有被释放。所以担心出现内存泄漏。

又测试了一下,运行10 000次,前后得free结果分别为:

total            used       free         shared  buffers         cached
222944   38184     188760    0           4912           8960                //运行前
222944   40744     182200    0           11884         9000                //运行后

这样是否正常?这是single登陆测试的
回复 支持 反对

使用道具 举报

发表于 2005-5-28 11:01:29 | 显示全部楼层
建议楼主好好看看操作系统原理,然后再来思考这个问题吧。
回复 支持 反对

使用道具 举报

发表于 2005-5-28 12:55:32 | 显示全部楼层
请用:
$ ps guax
其实中的VSZ是进程的虚拟空间大小,RSS占用的物理空间大小,RSS<=VSZ。在进程运行的过程中观察这两个值的变化,如果VSZ或RSS不断变大,那么可能就是内存泄漏了。
你用的方法完全没有意义。
回复 支持 反对

使用道具 举报

发表于 2005-5-28 13:10:00 | 显示全部楼层
用mtrace测试一下,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表